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