hibernate不理解双向onetoone中的“optional = true”

时间:2014-10-21 04:37:10

标签: hibernate jpa one-to-one bidirectional

我坚持使用“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

这是一个错误还是我误解了什么?

(我的英语不太好,如果有人更正了我的文字,我会很感激,但你不需要)。

0 个答案:

没有答案