Я пытаюсь имитировать отношения один-один. Когда я пытаюсь добавить 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();
}
}
Где я буду неправильно?
Попробуйте добавить em.flush() после em.persist(). – JMelnik