我一直在网上寻找一个合适的答案,但我所得到的只是困惑。我正在努力解决hibernate中的@ManyToOne
注释应该如何工作 - 因为带有@OneToMany
的{{1}}看起来更好,因为hibernate正确地插入外键而不是我必须分配子对象在保存之前的java中。
基本上作为最简单的例子,我有这样的事情:
@JoinColumn
现在,如果我发送一些映射到Parent Table: id int,
Child Table : id int, parentFk int
public class Parent{
@Id
@GeneratedValue
private Integer id;
@OneToMany
@JoinColumn(name = "parentFk")
private List<Child> children;
//setters and getters
}
public class Child{
@Id
@GeneratedValue
private Integer id;
@Column
private Integer parentFk;
//setters and getters
}
类的json并请求hibernate保存它,它将保存表中的所有内容,包括parentFk字段中父项的新id。然而,我一直认为这实际上是错误的做事方式,而我应该在Parent
班级做@OneToMany(mappedBy = "id")
而不是Parent
{ {1}}和@ManyToOne
类中的@JoinColumn
对象。
问题是这样做我必须通过java代码在子代码中手动设置父对象,然后hibernate会正确地将父对象的id保存在parentFk字段中...它看起来像是一个很长的啰嗦做一些已经完美适合我的事情(尽管我无法从孩子那里访问父对象)。
此外,我试图删除子对象中的parentFk字段,并将Parent
与父对象引用一起使用,但hibernate似乎不喜欢它。我做错了吗?
答案 0 :(得分:0)
你的映射应该是这样的。
public class Parent{
@Id
@GeneratedValue
private Integer id;
@OneToMany(mappedBy="parent", cascade={CascadeType.ALL})
private List<Child> children;
//setters and getters
}
public class Child{
@Id
@GeneratedValue
private Integer id;
@ManyToOne
@JoinColumn(name="parentFk")
private Parent parent;
//setters and getters
}
您还应该在父级上使用add(Child child)
方法(并删除)来管理关系。假设Parent
和Child
位于同一个包中,我会使setParent
包上的Child
受到保护,即无访问修饰符(setParent(Parent parent) { this.parent=parent})
。
public void add(Child child) {
child.setParent(this);
this.children.add(child);
}
当这样做时,hibernate将能够执行正确的查询。
答案 1 :(得分:0)
通过对@OneToMany映射使用@JsonManagedReference和@ManyToOne上的@JsonBackReference进行修复