标题是自我解释的。
我很高兴听到解决方案,谢谢。
答案 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();
答案 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)
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();
}