Как получить поле с аннотацией @Id в EJB3 (JPA) и Hibernate? - PullRequest
3 голосов
/ 04 октября 2011

Название говорит само за себя.

Буду рад услышать решения, спасибо.

Ответы [ 7 ]

4 голосов
/ 04 октября 2011

JPA2 имеет метамодель.Просто используйте это, и тогда вы будете соответствовать стандартам.Документы любой реализации JPA должны предоставить вам достаточно информации о том, как получить доступ к метамодели

3 голосов
/ 27 июня 2013

Существует более короткий подход, чем перечисленный до сих пор:

Reflections r = new Reflections(this.getClass().getPackage().getName());
Set<Field> fields = r.getFieldsAnnotatedWith(Id.class);
2 голосов
/ 04 октября 2011

Я расширил этот ответ: Как получить аннотации к переменной-члену?

Попробуйте это:

String findIdField(Class cls) {
    for(Field field : cls.getDeclaredFields()){
        Class type = field.getType();
        String name = field.getName();
        Annotation[] annotations = field.getDeclaredAnnotations();
        for (int i = 0; i < annotations.length; i++) {
            if (annotations[i].annotationType().equals(Id.class)) {
                return name;
            }
        }
    }
    return null;
}
2 голосов
/ 04 октября 2011

Я не программист java и не пользователь аннотаций Hibernate ... но я, вероятно, все еще могу помочь.

Эта информация доступна в метаданных. Вы можете получить их с фабрики сессий. Я выгляжу так:

ClassMetadata classMetadata = getSessionFactory().getClassMetadata(myClass);
string identifierPropertyName = classMetadata.getIdentifierPropertyName();

Я нашел эту документацию API .

1 голос
/ 14 мая 2018

Немного опоздал на вечеринку, но если вы знаете, что ваши сущности имеют только одну аннотацию @Id и знаете тип идентификатора (в данном случае Integer), вы можете сделать это:

Metamodel metamodel = session.getEntityManagerFactory().getMetamodel();
String idFieldName = metamodel.entity(myClass)
    .getId(Integer.class)
    .getName();
1 голос
/ 18 июня 2012

ClassMetadata.getIdentifierPropertyName() возвращает ноль, если у сущности есть составной идентификатор со встроенным ключом многие-к-одному. Таким образом, этот метод не охватывает эти ситуации.

0 голосов
/ 10 ноября 2015

Это работает для EclipseLink 2.6.0, но я не ожидаю каких-либо различий в пространстве Hibernate:

  String idPropertyName;
  for (SingularAttribute sa : entityManager.getMetamodel().entity(entityClassJpa).getSingularAttributes())
     if (sa.isId()) {
        Preconditions.checkState(idPropertyName == null, "Single @Id expected");
        idPropertyName = sa.getName();
     }
...