我想在两个实体(也是mysql中的表)之间创建OneToOne关系。当我收到发布请求时,我想保存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设置为A类型,但是当我调用get方法时,他将循环调用A和B嵌套的A,以此类推。 我只想将A的ID保存在B中,而不是整个对象中,否则当我调用get方法并且循环返回时,他将返回整个对象。 映射正确,而不是B中a_id中值的自动设置。
我期望的是:当我创建A时,B会自动获取A的ID,并在我请求保存对象A时将其保存到db中的列(“ id_a”)中。也与删除一起工作(当我删除A时,B也被删除)。 匹配的JSON将是:
{
"a":{
"id_a": "value",
},
"b":{
"id_b": "value",
"a_id": "id_a"
}
}
感谢您的咨询。
答案 0 :(得分:0)
从外观上看
@OneToOne
@JoinColumn(name = "idA_id")
A a;
将是您需要的更改
答案 1 :(得分:0)
您需要在两个类中提供一对一的映射[参考]。 如果是父级引用(不是自动设置),则可以创建一个临时变量并使用它来设置父级的主键。
尝试以下示例:
@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);
}
}
}