2014-09-16 4 views
1

Я стараюсь иметь однонаправленные отношения OneToOne b/w два класса «Ресторан» и «Менеджер». «Менеджер» - это дочерний класс, который имеет один атрибут, называемый restaurantId. вот мой код и проблема объясняется ниже его:Spring-data-jpa OneToOne Однонаправленная проблема

Restaurant.java:

@Entity 
    public class Restaurant implements Serializable{ 

     @Id 
     private long id; 


    //getters and setters} 

RestaurantRepository.java

import java.util.List; 

import org.springframework.data.repository.CrudRepository; 

public interface RestaurantRepository extends CrudRepository<Restaurant, Long> { 
    List<Restaurant> findById(long id); 
} 

Manager.java:

@Entity 
public class Manager implements Serializable { 



    @Id 
     @GeneratedValue(strategy=GenerationType.AUTO) 
     private long id; 
     @OneToOne(fetch=FetchType.LAZY,optional=false,cascade = CascadeType.ALL) 
     @JoinColumn(name="restaurantId", referencedColumnName="id",nullable=false) 
     private Restaurant restaurantId; 

     //getters and setters} 

Я нахожусь пытаясь проверить метод добавления для Manager.java в классе ниже:

public class ManagerTest { 

    private CrudRepository repository; 
    @Test 
    public void testAddManager() { 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); 

     CrudRepository restaurantRepository = context.getBean(RestaurantRepository.class); 

     Date date = new Date(); 
     Restaurant restaurant = (Restaurant) restaurantRepository.findOne(1L); 
     repository = context.getBean(ManagerRepository.class); 
     createManager("x","xx","xxxxxxxx","x","x","x","India","null","null", date, "[email protected]", restaurant); 

     context.close(); 

    } 

    private void createManager(String firstName, String lastName, String contactNo, String addrStreet,String addrCity, String addrState, String addrCountry, String addrLat, String addrLong, Date birthDate, String email, Restaurant restaurant){ 
     Manager manager = new Manager(firstName, lastName, contactNo, addrStreet, addrCity, addrState, addrCountry, addrLat, addrLong, birthDate, email); 
     manager.setRestaurantId(restaurant); 
     repository.save(manager); 

    } 
} 

С вышеуказанным кодом я ожидаю новую запись в таблице Manager, но она пытается сделать запись в таблице ресторанов.

здесь ошибка консоли в затмении:

Hibernate: insert into Restaurant (addrCity, addrCountry, addrLat, addrLong, addrState, addrStreet, contactNo, maxCapacity, name, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Sep 16, 2014 2:24:20 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
WARN: SQL Error: 1062, SQLState: 23000 
Sep 16, 2014 2:24:20 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: Duplicate entry '1' for key 'PRIMARY' 
Sep 16, 2014 2:24:20 PM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release 
INFO: HHH000010: On release of batch it still contained JDBC statements 

пожалуйста, помогите мне здесь. Любое предложение было бы здорово. :)

+0

Как вы обрабатывать транзакции? .. Я думаю, что resturant отключен, когда вы сохраняете Manager и CASCADE.ALL, снова сохраняете Resturat, у которых есть ID = 1 «Дублировать первичный ключ». Можете ли вы добавить свою конфигурацию? .. один возможный тест - добавить объект-resturant @GeneratedValue (strategy = GenerationType.AUTO), если упор будет другой, как я говорю – Xstian

ответ

0

Возможно, вы пытаетесь добавить запись с уже существующим идентификатором

Либо вы забыли AUTO_INCREMENT идентификатора или вы выбрали неверный (уже существующий) идентификатор для менеджера/ресторан.

Вы можете найти более подробно там Error Code: 1062. Duplicate entry '1' for key 'PRIMARY'

+0

Я думаю, проблема здесь в том, что он указывает однонаправленную ссылку OneToOne от менеджера в ресторан, а затем пытается для сохранения объекта Manager. Объект ресторана, который он связывает с объектом-менеджером, уже существует в Db. Поэтому, когда вы пытаетесь создать запись Менеджера, она не должна пытаться снова сохранить запись в Ресторане. Как предотвратить сохранение входа в ресторан? –

Смежные вопросы