如何在EJB3(JPA)和Hibernate中使用@Id对字段进行注释?

时间:2011-10-04 11:58:46

标签: hibernate jpa annotations ejb-3.0

标题是自我解释的。

我很高兴听到解决方案,谢谢。

7 个答案:

答案 0 :(得分:4)

JPA2有一个元模型。只需使用它,然后您就可以保持标准。任何JPA实现的文档都应该为您提供有关如何访问元模型的足够信息

答案 1 :(得分:3)

到目前为止,方法比目前更短:

Reflections r = new Reflections(this.getClass().getPackage().getName());
Set<Field> fields = r.getFieldsAnnotatedWith(Id.class);

答案 2 :(得分:2)

我不是Java程序员,也不是Hibernate注释的用户......但我可能仍然可以提供帮助。

此信息在元数据中可用。您可以从会话工厂获取它们。我看起来像这样:

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

我找到了this API documentation

答案 3 :(得分:2)

我扩展了这个答案:How to get annotations of a member variable?

试试这个:

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;
}

答案 4 :(得分:1)

如果实体具有嵌入式key-many-to-one的复合id,则

ClassMetadata.getIdentifierPropertyName()返回null。 所以这种方法不能涵盖这些情况。

答案 5 :(得分:1)

派对有点晚了,但是如果你碰巧知道你的实体只有一个@Id注释并且知道id的类型(在这种情况下是整数),你可以这样做:

Metamodel metamodel = session.getEntityManagerFactory().getMetamodel();
String idFieldName = metamodel.entity(myClass)
    .getId(Integer.class)
    .getName();

答案 6 :(得分:0)

这适用于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();
     }