在父子持久性中生成父ID

时间:2013-04-20 21:03:41

标签: java hibernate jpa

我有一对多的亲子关系,我想只坚持一次。我遇到的问题是,孩子的父母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更新子进程,因此无法在数据库当前定义时执行此操作。我可能不得不删除这个唯一的密钥,这很不幸......如果有办法,请告诉我!

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

1 个答案:

答案 0 :(得分:1)

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

之类的事情。