Подтвердить что ты не робот

Как получить первичный ключ любого объекта 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().

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Serializable id = session.getIdentifier(entity);

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

Ответ 3

Прочитайте статью о Общий подход Dao.

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

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

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

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

Ответ 4

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

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

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