Hibernate注释更好地以“错误”方式运行?

时间:2015-12-09 22:34:06

标签: java spring hibernate annotations

我一直在网上寻找一个合适的答案,但我所得到的只是困惑。我正在努力解决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似乎不喜欢它。我做错了吗?

2 个答案:

答案 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)方法(并删除)来管理关系。假设ParentChild位于同一个包中,我会使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进行修复