我有一对多的亲子关系,我想只坚持一次。我遇到的问题是,孩子的父母ID是其中的,但在持久性时,由于生成了ID,因此无法获得该ID。这是我到目前为止的设置:
public class Parent
{
@Id
@GeneratedValue(generator = "parent-id-gen")
@GenericGenerator(name = "parent-id-gen", strategy = "increment")
@Column(name = "id", nullable = false)
private long ID;
// some other fields
@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id")
private List<Child> children;
}
public class Child
{
@Id
@GeneratedValue(generator = "child-id-gen")
@GenericGenerator(name = "child-id-gen", strategy = "increment")
@Column(name = "id", nullable = false)
private long ID;
@Column(name = "parent_id", nullable = false)
private long parentID;
// some other fields
}
如果重要的话,数据库(PostgreSQL)看起来像这样:
CREATE TABLE parent
(
id integer NOT NULL,
... other fields,
PRIMARY KEY (id)
);
CREATE TABLE child
(
id integer NOT NULL,
parent_id integer NOT NULL,
... other fields,
PRIMARY KEY (id),
UNIQUE (parent_id, ... other fields)
);
我只想做一个org.hibernate.Session.saveOrUpdate(parentObject)
,但它在子表上的唯一键失败,因为parentID一直设置为0,而不是从父级生成的ID。
有没有办法做到这一点?
我认为Hibernate首先插入,然后使用父ID更新子进程,因此无法在数据库当前定义时执行此操作。我可能不得不删除这个唯一的密钥,这很不幸......如果有办法,请告诉我!
编辑:添加了数据库信息,因为它可能是相关的。
答案 0 :(得分:1)
Hibernate背后的想法是你的模型类是从关系之间的标识中抽象出来的。含义private long parentID
可以更改为private Parent parent
。这将让hibernate知道如何控制它,如果你需要父ID,你可以做child.getParent().getId()