使用ClassMetadata确定ManyToMany与OneToMany

时间:2009-09-03 17:11:11

标签: hibernate many-to-many

我正在使用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(),但这并不总能保证集合的类型。有什么想法吗?

2 个答案:

答案 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");
                }
            }
        }