我正在使用ClassMetadata来确定休眠POJO的结构。
我需要确定一个集合是OneToMany还是ManyToMany。这些信息在哪里?我可以不使用反射来达到它吗?请参阅下面的代码。
//Get the class' metadata
ClassMetadata cmd=sf.getClassMetadata(o.getClass());
for(String propertyName:cmd.getPropertyNames()){
if (cmd.getPropertyType(propertyName).isCollectionType() && cmd.??()) //Do something with @ManyToMany collections.
}
我所需要的只是方法来告诉我它是否与ManyTo____有关系。我看到了getPropertyLaziness(),但这并不总能保证集合的类型。有什么想法吗?
答案 0 :(得分:4)
不是那么简单,不幸的是。检测到这一点的最佳方法是检查特定的CollectionPersister
实现:
SessionFactory sf = ...;
// Get the class' metadata
ClassMetadata cmd = sf.getClassMetadata(o.getClass());
for(String propertyName:cmd.getPropertyNames()) {
Type propertyType = cmd.getPropertyType(propertyName);
if (propertyType.isCollectionType()) {
CollectionType collType = (CollectionType) propertyType;
// obtain collection persister
CollectionPersister persister = ((SessionFactoryImplementor) sf)
.getCollectionPersister(collType.getRole());
if (persister instanceof OneToManyPersister) {
// this is one-to-many
} else {
// this is many-to-many OR collection of elements
}
} // if
} // for
答案 1 :(得分:0)
这是一种可能性。
直接已知子类:ManyToOneType,OneToOneType。
SessionFactory sf = ...;
ClassMetadata cmd = sf.getClassMetadata(o.getClass());
for (String propertyName : cmd.getPropertyNames()) {
Type propertyType = cmd.getPropertyType(propertyName);
if (propertyType.isEntityType()) {
EntityType entityType = (EntityType) propertyType;
if (entityType instanceof ManyToOneType) {
System.out.println("this is ManyToOne");
} else if (entityType instanceof OneToOneType) {
System.out.println("this is OneToOne");
}
}
}