我有两个具有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?我认为这已经有效了
答案 0 :(得分:0)
你错过了关系的另一面。
如果您说bar.setFoo(foo)
,那么在您必须说foo.setBar(bar)
之后,当然您也可以在setFoo
方法中执行此操作。
级联意味着它将触发对关系的操作,但是在你的情况下,由于一方缺失,关系未完成。
答案 1 :(得分:0)
您需要先了解这些关系。正如我在此处看到的那样,您可能会尝试在Foo
和Bar
之间建立双向 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
的映射一起保留。做相反的事情没有意义。不是吗?