通过Hibernate + JPA在两个实体中保存id

时间:2017-03-27 23:47:51

标签: java hibernate jpa one-to-one

我有两个具有OneToOne关系的实体,如下所示:

@Entity
@Table(name = "FOO")
Foo{

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "foo")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    @JoinColumn(name = "BAR_ID")
    private Bar bar;

    // getters and setters
 }

 @Entity
 @Configurable
 @Table(name = "BAR")
 Bar{
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "FOO_ID")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    private Foo foo;

    // getters and setters
 }

在服务层中,我通过在Foo中设置Bar来进行连接:

 Bar.setFoo(foo);
 barDAO.saveOrUpdate(bar);

将foo id保存在Bar表中。但事实恰恰相反。是否可以让hibernate保存两个只生成一组的ID?我认为这已经有效了

2 个答案:

答案 0 :(得分:0)

你错过了关系的另一面。

如果您说bar.setFoo(foo),那么在您必须说foo.setBar(bar)之后,当然您也可以在setFoo方法中执行此操作。

级联意味着它将触发对关系的操作,但是在你的情况下,由于一方缺失,关系未完成。

答案 1 :(得分:0)

您需要先了解这些关系。正如我在此处看到的那样,您可能会尝试在FooBar之间建立双向 OneToOne 关系。

@Entity
@Table(name = "FOO")
Foo {

     @OneToOne(cascade = CascadeType.ALL)
     @JoinColumn(name = "BAR_ID")
     private Bar bar;

     // getters and setters
}

@Entity
@Table(name = "BAR")
Bar{

    @OneToOne(mappedBy = "bar")
    private Foo foo;

    // getters and setters
}
  

在双向关联中双方退出 -   拥有和反向。对于一对一的双向关系,   拥有方对应于包含适当方的一方   外键。

此处拥有方Foo,BAR_ID将是该外键。在两端加入专栏都没有意义。关系将从Foo级联到Bar。此处的反面Bar,需要使用拥有方参考的mapped by值进行注释。

现在,如果您在Bar中设置Foo对象,则会Bar对象与Foo的映射一起保留。做相反的事情没有意义。不是吗?