Как получить первичный ключ любого объекта JPA? - PullRequest
13 голосов
/ 25 июля 2010

Для каждого @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 ]

38 голосов
/ 26 июля 2010

Эта функциональность была добавлена ​​в JPA 2.0. Просто позвоните:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity);
5 голосов
/ 25 июля 2010

Прочитайте статью о Универсальном подходе Дао .

Я не совсем понимаю вашу проблему, но если вы хотите получить идентификатор организации - просто получите его. Он доступен после того, как постоянный метод завершен, т.е.

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

Я обычно создаю класс AbstractEntity с полем id и его средствами доступа и наследую все остальные мои сущности из этого класса.

Единственная проблема с этим подходом состоит в том, что если вам нужно сделать любую из ваших сущностей сериализуемой, вам придется сделать AbstractEntity сериализуемой, то есть все другие сущности станут сериализуемыми. В противном случае поле id не будет сериализовано в объекте, который должен быть сериализуемым.

4 голосов
/ 25 июля 2010

Я использую общий интерфейсный подход, и он отлично работает. Используя чистый JPA, я не вижу способа получить идентификатор.

Взгляните на merge(). Я сам этим мало пользовался, но думаю

Hibernate имеет способы сделать это

Serializable id = session.getIdentifier(entity);

Но это не стандарт JPA.

1 голос
/ 06 сентября 2017

Другой способ получения идентификатора сущности:

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

В этом подходе используется метод extractPrimaryKeyFromObject () из ObjectBuilder класса.

...