Java 通过Hibernate+;将id保存在两个实体中;JPA
我有两个实体,它们之间有一个关系,比如:Java 通过Hibernate+;将id保存在两个实体中;JPA,java,hibernate,jpa,one-to-one,Java,Hibernate,Jpa,One To One,我有两个实体,它们之间有一个关系,比如: @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 setter
@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);
Wich将foo id保存在Bar表中。但事实并非如此。hibernate是否可以只保存一个ID集的两个ID?我以为这已经奏效了你错过了关系的另一面 如果你说
bar.setFoo(foo)
那么在你不得不说foo.setBar(bar)
之后,当然你也可以在setFoo
方法中这样做
级联意味着它将触发对关系的操作,但是在您的情况下,关系未完成,因为缺少了一方。您需要首先了解这些关系。正如我在这里看到的,您可能试图在
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将是外键。两端都有join列是没有意义的。和关系将从Foo
级联到Bar
。而反向侧在这里是条
,需要用所属侧引用的值映射的进行注释
现在,如果您在Foo
中设置Bar
对象,它会将Bar
对象与Foo
映射一起保存。做相反的事情是没有意义的。不是吗?“相反的事情不会发生”这是什么意思?数据库中存在一个FK。。。在酒吧里。福桌上永远不会有FK!但是如果我只调用Foo.getBar(),Hibernate将从Foo获得Bar?或者我必须显式地将它添加到DAO层上(更改getById方法)?是的,Hibernate会为您这样做。将在对象中提取除惰性
字段以外的所有关联字段,并且foo.getbar()
将返回关联的条