4

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

SELECT * FROM REFERENTIAL_CONSTRAINTS WHERE REFERENCED_TABLE_NAME = 'table_name';

我想通过java代码来实现这个功能。

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

4

3 回答 3

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。

于 2013-04-04T11:28:19.850 回答
0

如果您使用的是 Eclipse 或 netbeans 之类的 IDE,这可以帮助您通过搜索与“table_name”对应的类的类型的 setter 或 getter 的调用层次结构

于 2013-04-04T11:06:20.623 回答
0

我自己偶然发现了这个问题;所以这是一个很晚的答案,一个可能的解决方案的休眠版本:

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);
        }
    }
}
于 2015-07-24T14:42:06.480 回答