Как получить первичный ключ любой сущности 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 я пытаюсь достичь @Entity, хотя понимаю, что это не отношения наследования. Какой класс я могу использовать для ссылки на каждый объект JPA? Я мог бы просто создать интерфейс / абстрактный класс MyEntities и наследовать их все, но так ли это? Я надеюсь на меньший код. Кроме того, я ожидаю, что смогу извлечь первичный ключ каждой сущности, как я пытаюсь .getId().

4 ответов


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

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity);

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

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

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

Serializable id = session.getIdentifier(entity);

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


Читать статью о общий подход Dao.

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

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

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

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


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

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

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