通过多对一或一对一的关系查找引用给定类的所有类

时间:2013-04-04 10:56:15

标签: java hibernate annotations

我可以通过外键引用在给定表引用的数据库中查找表。特别是在 mysql 中,它通过以下方式完成:

SELECT * FROM REFERENTIAL_CONSTRAINTS WHERE REFERENCED_TABLE_NAME = 'table_name';

我想通过 java 代码实现此功能。

也就是说,我希望 通过多对一或一对一的关系找到所有引用给定类的类

3 个答案:

答案 0 :(得分:2)

这可以在NHibernate(不是Hibernate)中完成,如下所示。

IList<string> classList = new List<string();
ICollection<PersistentClass> persistentClasses = Configuration.ClassMappings;
foreach (var persistentClass in persistentClasses)
{
    foreach (var property in persistentClass.PropertyIterator)
    {
         if(property.Type.IsAssociationType == true && property.Type.ReturnedClass.Name == "GivenClassName")
         {
             classList.Add(persistentClass.EntityName);
         }
    }
}
return classList;

所有类映射都在集合中进行检索,并进行迭代以查找其属性与给定类之间的关联。 我认为Hibernate也有类似的API,所以这也可以在Hibernate中完成。 另请注意,此代码在C#中,但我想也许正在查看它,您也可以在Java中编写类似的代码。

请参阅在{Hibernate中演示类似API的this answer

答案 1 :(得分:0)

如果您使用的是像Eclipse或netbeans这样的IDE,这可以帮助您通过搜索与“#table;&#39;

对应的类类型的setter或getter的调用层次结构。

答案 2 :(得分:0)

我自己偶然发现了这个问题;所以,对于可能的解决方案的Hibernate版本来说,这是一个非常晚的答案:

import org.hibernate.metadata.ClassMetadata;
import org.hibernate.type.EntityType;
import org.hibernate.type.Type;

[...]

Set<Class<?>> referencingClasses = new HashSet<Class<?>>();
for (Entry<String, ClassMetadata> entry:sessionFactory.getAllClassMetadata().entrySet())
{
    Class<?> clazz=entry.getValue().getMappedClass();
    for (String propertyName: entry.getValue().getPropertyNames())
    {
        Type t=entry.getValue().getPropertyType(propertyName);
        if (t instanceof EntityType)
        {
            EntityType entityType=(EntityType)t;
            if (entityType.getAssociatedEntityName().equals(YourClass.class.getName())) referencingClasses.add(clazz);
        }
    }
}