Java 使用外键休眠JPA OneToOne关系

Java 使用外键休眠JPA OneToOne关系,java,hibernate,one-to-one,Java,Hibernate,One To One,我想在两个实体(也是mysql中的表)之间创建一个OneToOne关系。当我收到post请求时,我想保存a实体,然后自动保存B实体,因为B中有一列(“a_id”)是a(“id_a”)中主键的外键。我怎样才能正确地绘制它们 @Table("a_tb") public class A(){ @Column(name="id_a") private Long idA; @OneToOne(mappedBy = "aId", cascade = CascadeType.ALL,

我想在两个实体(也是mysql中的表)之间创建一个OneToOne关系。当我收到post请求时,我想保存a实体,然后自动保存B实体,因为B中有一列(“a_id”)是a(“id_a”)中主键的外键。我怎样才能正确地绘制它们

@Table("a_tb")
public class A(){
    @Column(name="id_a")
    private Long idA;
    @OneToOne(mappedBy = "aId", cascade = CascadeType.ALL,
        fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
    private B b;
}
@Table("b_tb")
public class B(){
    @Column(name="id_b")
    private Long idB;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private Long aId;
}
我尝试将idA设置为类型,但当我调用get方法时,他将循环调用A和B innested,将其设置为A innested,以此类推。。 我只想在B中保存A的id,而不是整个对象,否则当我调用get方法并且循环返回时,他将返回整个对象。 映射是正确的,而不是自动设置B中a_id中的值

我期望的是:当我创建A时,B会自动获取A的id,并在我请求保存对象A时将其保存到db中的列(“id_A”)。这也适用于delete(当我删除A时,B也会被删除)。 匹配的JSON将是:

{
 "a":{
      "id_a": "value",
     },
 "b":{
      "id_b": "value",
      "a_id": "id_a"
     }
 }

谢谢你的建议。

从第一眼看上去

@OneToOne
@JoinColumn(name = "idA_id")
A a; 

将是您需要的更改,

您需要在这两个类中提供一对一映射[参考]。 如果父引用,而不是自动设置,则可以创建一个临时变量并使用它设置父的主键

试试这个例子:

@Table("a_tb")
    public class A(){
        @Column(name="id")
        private Long id;
        @OneToOne(mappedBy = "aId", cascade = CascadeType.ALL,
            fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
        private B b;
    }

    @Table("b_tb")
    public class B(){
        @Column(name="id")
        private Long id;
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "a_id")
        private A a;

        @Transient
        private Long aId;

        // getters and setters

        public void setAId(Long aId){
            if(aId != null){ 
               this.a = new A();
               this.a.setId(aId);
            }
        }
    }

更新了问题,您所说的将返回整个对象A,而不仅仅是id。否则,当我调用get方法时,他将返回整个对象。那要看情况。Hibernate可能返回仅附加ID的代理,而不是实际对象。例如,如果您将延迟加载@OneToOne关系对象并调用GetHatObject().getId(),则不会加载该延迟关系,Id将按请求返回。我不认为在如何使用Hibernate方面比Hibernate聪明是个好主意。这同样适用于要设置的eg ID。如果您直接使用EntityManager,您可以创建对象、设置id和设置关系,甚至可以使用计划引用。有,但我希望避免调用set方法。。hibernate应该在没有任何手动设置的情况下执行此操作