外部キー参照を介して、特定のテーブルによって参照されるデータベース内のテーブルを見つけることができます。特にmysqlでは、次の方法で実行されます。
SELECT * FROM REFERENTIAL_CONSTRAINTS WHERE REFERENCED_TABLE_NAME = 'table_name';
この機能をJavaコードで実現したいと考えています。
つまり、多対 1 または 1 対 1 の関係を通じて、特定のクラスを参照するすべてのクラスを見つけたいと考えています。
外部キー参照を介して、特定のテーブルによって参照されるデータベース内のテーブルを見つけることができます。特にmysqlでは、次の方法で実行されます。
SELECT * FROM REFERENTIAL_CONSTRAINTS WHERE REFERENCED_TABLE_NAME = 'table_name';
この機能をJavaコードで実現したいと考えています。
つまり、多対 1 または 1 対 1 の関係を通じて、特定のクラスを参照するすべてのクラスを見つけたいと考えています。
これは、次のように (Hibernate ではなく) 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 を示すこの回答を参照してください。
私は自分でこの問題に出くわしました。したがって、可能なソリューションの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);
}
}
}