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()
将返回关联的