web-dev-qa-db-ja.com

JPAエンティティの主キーを取得するにはどうすればよいですか?

@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に到達しようとしていますが、継承関係ではないことに気づきました。すべてのJPAエンティティを参照するためにどのクラスを使用できますか?インターフェイス/抽象クラスMyEntitiesを作成して、それらすべてを継承させることもできますが、それはその方法ですか?私はより少ないコードを望んでいます。また、.getId()で試行するように、すべてのエンティティの主キーを抽出できることを期待しています。

13
simpatico

この機能はJPA2.0で追加されました。単に電話してください:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity);
40
Gordon Yorke

ジェネリックDaoアプローチ に関する記事を読んでください。

私はあなたの問題を明確に理解していませんが、エンティティIDを取得したい場合は、取得してください。永続化メソッドが完了した後に使用できます。

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

私は通常、フィールドAbstractEntityとそのアクセサーを使用してクラスidを作成し、このクラスから他のすべてのエンティティを継承します。

このアプローチの唯一の問題は、エンティティのいずれかをシリアル化可能にする必要がある場合、AbstractEntityをシリアル化可能にする必要があることです。つまり、他のすべてのエンティティがシリアル化可能になります。それ以外の場合、フィールドidは、シリアル化可能である必要があるエンティティでシリアル化されません。

6
Roman

一般的なインターフェースアプローチは私が使用するものであり、それはうまく機能します。純粋なJPAを使用すると、識別子を取得する方法がわかりません。

merge()を見てください。自分ではあまり使っていませんが、

Hibernateにはこれを行う方法があります

Serializable id = session.getIdentifier(entity);

しかし、これはJPA標準ではありません。

5
Mike Q

エンティティIDを取得する別の方法は次のとおりです。

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

このアプローチでは、extractPrimaryKeyFromObject()メソッドfromObjectBuilderクラス。

1
ngCoder