1

我有一对多的父子关系,我只想将整个事情坚持一次。我遇到的问题是孩子里面有父母的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 更新子 ID,因此由于当前定义了数据库,因此无法执行此操作。结果我可能不得不删除唯一键,这很不幸......如果有办法解决这个问题,请告诉我!

编辑:添加了数据库信息,因为它可能是相关的。

4

1 回答 1

1

Hibernate 背后的想法是,您的模型类是从关系之间的标识内容中抽象出来的。含义private long parentID可以更改为private Parent parent。这会让hibernate知道如何控制它,如果你需要父母的ID,你可以做类似的事情child.getParent().getId()

于 2013-04-20T21:16:33.740 回答