我坚持使用“Java Persistence with Hibernate”一书中的一个例子,第7.1.3章。
我修改了一些例子,因为它太简单了。
我将两个实体映射为与连接表的一对一关联。它是双向的和可选的:
@Entity
public class Shipment {
@OneToOne(optional=true)
@JoinTable(
name="ITEM_SHIPMENT",
joinColumns = @JoinColumn(name="SHIPMENT_ID"),
inverseJoinColumns = @JoinColumn(name="AUCTION_ID")
)
private Item auction;
...
@Entity
public class Item {
@OneToOne(mappedBy="auction", optional=true)
@JoinTable(
name="ITEM_SHIPMENT",
joinColumns = @JoinColumn(name="AUCTION_ID"),
inverseJoinColumns = @JoinColumn(name="SHIPMENT_ID")
)
private Shipment shipment;
...
但实体经理的行为如协会(在项目方面)不是可选的(方面是可以的)。我希望实体管理器只保留一个Item实例而不指定相应的Shipment。
Item newItem = new Item("item1");
Shipment newShipment = new Shipment();
newShipment.setState(ShipmentState.Start);
em.persist(newItem);//line29 // save either of two objects (without links - newItem.getShipment() returns null)
newShipment.setAuction(newItem); // link them to each other
newItem.setShipment(newShipment);
em.persist(newShipment);//line32 // save second object
Item newItemSecond = new Item("item2");
em.persist(newItemSecond);//line35
运行此测试代码会在第29行(代码em.persist(newItem);
)上提供此异常:
org.hibernate.PropertyValueException:not-null属性引用null或transient值:com.example._7._1._3.simple.ann.Item.shipment
如果我交换了第29行和第32行,它可以正常工作,但提到的异常会在第35行抛出,它无法持久存在newItemSecond
。
这是一个错误还是我误解了什么?
(我的英语不太好,如果有人更正了我的文字,我会很感激,但你不需要)。