2012-06-08 2 views
0

Я пытаюсь имитировать отношения один-один. Когда я пытаюсь добавить nullable = false,
в атрибуте столбца соединения, я получаю исключение SQLIntegrityContraintViolationException, указывающее, что идентификатор адреса равен NULL. Я ожидаю этого, потому что автоматически генерируемое значение, которое я использую в id, генерируется во время фиксации. (Am i RIGHT?) ...JPA joinColumn error

Но, когда я делаю модификацию в конструкторе адресов, устанавливая там идентификатор, а затем пытаюсь сохранить. Я получаю то же исключение. Я не понимаю, почему.

Однако, если я удалю nullable = false, я могу exeucte его нормально. Пожалуйста, объясните, где я ошибаюсь.

Вот мои реализации. Геттеры и сеттеры были опущены для простоты.

@Entity 
    public class CustomerEX implements Serializable { 
     private static final long serialVersionUID = 1L; 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private Long id; 
     private String name; 
     @OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST) 
     @JoinColumn(name="address_fk") 
     private AddressEx address; 

    public void setAddress(AddressEx address) { 
    this.address = address; 
    this.address.setCustomer(this); 
} 

     --- 
     ---- 
    } 

and 

     @Entity 
    public class AddressEx implements Serializable { 

     private static final long serialVersionUID = 1L; 
     @Id 
     @GeneratedValue 
     private Long id; 
     private String city; 
     private String country; 
     @OneToOne 
     private CustomerEX customer; 
     } 

и моя главная функция как ...

public class CustomerTest { 

    public static void main(String[] args) { 
     AddressEx addr = new AddressEx(); 
     addr.setCity("Bangalore"); 
     addr.setCountry("India"); 
     System.out.println(addr.getId()+ " is the id of this object"); 
     CustomerEX cust = new CustomerEX(); 
     cust.setName("ravi"); 

     cust.setAddress(addr); 

     EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceAppPU"); 
     EntityManager em = emf.createEntityManager(); 

     EntityTransaction etx = em.getTransaction();     
     etx.begin(); 
     em.persist(cust); 
     etx.commit(); 
    } 
} 

Где я буду неправильно?

+0

Попробуйте добавить em.flush() после em.persist(). – JMelnik

ответ

0

Вы должны каскадировать действие persist от клиента к адресу. Вы сохраняете клиента, но адрес еще не имеет идентификатора, поскольку он сгенерирован

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