15

对于每个@Entity,我需要执行以下操作:

public <Entity> boolean insert(final Entity entity){
    if (em.find(entity.getClass(), entity.getId()) == null) {
        et.begin();
        em.persist(entity);
        et.commit();
        return true;
    }
    return false;
}

也就是说,如果实体不存在,则将其保留,并知道它是否存在。使用 Entity 我试图达到@Entity,尽管我意识到这不是继承关系。我可以使用什么类来引用每个 JPA 实体?我可以只创建一个接口/抽象类 MyEntities 并让它们全部继承,但就是这样吗?我希望代码更少。此外,我希望能够提取每个实体的主键,就像我在 .getId() 中尝试的那样。

4

4 回答 4

46

此功能是在 JPA 2.0 中添加的。只需调用:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity);
于 2010-07-26T13:10:45.923 回答
6

阅读有关Generic Dao 方法的文章。

我不清楚你的问题,但如果你想获得实体 id - 就得到它。它在persist方法完成后可用,即

em.persist(entity);
et.commit();
int id = entity.getId()

我通常AbstractEntity用字段id及其访问器创建一个类,并从这个类继承我的所有其他实体。

这种方法的唯一问题是,如果您需要使您的任何实体可序列化,则您必须使其AbstractEntity可序列化,即所有其他实体都将变为可序列化。否则字段id将不会在应该可序列化的实体中被序列化。

于 2010-07-25T11:13:32.007 回答
5

我使用的是通用接口方法,它工作正常。使用纯 JPA,我看不到获取标识符的方法。

看看merge()。我自己用的不多,但我认为

Hibernate 有办法做到这一点

Serializable id = session.getIdentifier(entity);

但这不是 JPA 标准。

于 2010-07-25T11:02:52.433 回答
1

另一种获取实体 ID 的方法是:

Session session = entityManager.unwrap(Session.class);
Object entityId = session.getId(entity);

此方法使用ObjectBuilder类中的extractPrimaryKeyFromObject()方法。

于 2017-09-06T11:22:39.713 回答