@GeneratedValue创建新实例时

时间:2013-10-15 11:02:22

标签: java jpa

我有一个带有@GeneratedValue()的实体。我知道有不同的世代类型。我的问题是:当我创建实体的新实例时,是否存在生成ID的代典型?我需要我的对象的id来创建另一个id为FK的对象,但是我不想在创建另一个对象之前坚持objekt。谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

您根本不必担心获取生成的ID。只需在Java端设置对象关系(使用setter方法),在persist()上,JPA将确保生成的PK在依赖对象上设置为FK。

举个例子,如果您有以下实体类

@Entity
public class PKClass {

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

    // getters/setters
}

@Entity
public class FKClass {

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

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "PK_ID")
    private PKClass pk;

    // getters/setters
}

你会坚持他们(不用担心主键)

// create a new transaction
EntityTransaction tx = em.getTransaction();
tx.begin();

// setup Java relationships
PKClass pk = new PKClass();
FKClass fk = new FKClass();
fk.setPK(pk);

// persist
em.persist(fk);

// close transaction
tx.commit();

答案 1 :(得分:0)

您可以调用store()方法。存储方法尚未将对象保留在DB中。它在hibernate缓存层中创建一个代理对象,并返回该代理对象,并填充主键(是的,自动生成的值可用)。您可以根据需要将此值用于其他对象。完成后,当您刷新会话时,所有对象都会保留在数据库中。