8

我有一个关于 Hibernate 的一般性问题,我正在与之抗争。

我有 A 类和 B 类,其中 B 依赖于 A

在我的代码中,当我调用 em.persist(objOfTypeA) 时,我希望插入能够插入到表 AAA 和 BBB 中。如果我手动让 A 获取 A 的 ID 并将其填充到每个对象的列表中,然后保留该列表,那么一切正常。但我希望这会通过 Hibernate神奇地发生。

难道我做错了什么?还是我只是对 Hibernate 期望过高?

谢谢

@Entity
@Table(name = "AAA")
@Veto
public class A {

    @Id
    @GeneratedValue
    @Column(name = "Id")
    private Long id;


    @NotNull
    @Column(name = "Name")
    private Long name;

    ...

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
    private List<B> b;
...
}

@Entity
@Table(name = "BBB")
@Veto
public class B {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long id;

    @NotNull
    @Column(name="AId")
    private Long aId;

    @NotNull
    @Column(name = "Name")
    private Long name;

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false)
    @ManyToOne(optional = false)
    private A a;
...     
}
4

2 回答 2

3

我终于解决了。我得到或找到的例子都没有告诉我到底出了什么问题,只有在我自己的实验之后,我才设法得出这个结论:

而不是拥有

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<B> b;

这不起作用(FK 仍然是 NULL)

这确实有效:

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name="AId")
@NotNull
private List<B> b;
于 2012-03-05T12:25:05.213 回答
1

修改类的映射B如下,

@Entity
@Table(name = "BBB")
@Veto
public class B {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long id;

    @NotNull
    @Column(name="AId", updatable = false, insertable = false)
    private Long aId;

    @NotNull
    @Column(name = "Name")
    private Long name;

    @JoinColumn(name = "AId", referencedColumnName="Id")
    @ManyToOne(optional = false)
    private A a;
...     
}

你在错误的地方使用了属性updatable = false, insertable = false,我已经更正了。

阅读此处了解它们的工作原理。

于 2012-02-25T14:31:52.243 回答