gpt4 book ai didi

java - 如何在 hibernate 中检索关系映射?

转载 作者:搜寻专家 更新时间:2023-11-01 03:22:24 26 4
gpt4 key购买 nike

我需要获取两个模型类之间的关系。例如在数据库中,我有两个表 table1 和 table2。其中 table2 具有 table1 的外键。我有两个类 Table1 和 Table2 分别映射到这些表,并且具有一对一的关系映射。

现在,我需要从 Java 代码中检索它们之间的关系?即上面例子的输出应该是一对一的。

最佳答案

我准备了这个演示来查找两个 hibernate 实体类之间的关联类型。发布此答案可能会帮助其他社区用户。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata;
import org.hibernate.persister.collection.BasicCollectionPersister;
import org.hibernate.persister.collection.OneToManyPersister;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.type.ManyToOneType;
import org.hibernate.type.OneToOneType;
import org.hibernate.type.Type;

/**
*
* @author shruti
*/
public class RelationDemo {

public static void main(String[] args) throws Exception {

Configuration configuration = new Configuration().configure();
ServiceRegistryBuilder builder = new ServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionfactory = configuration.buildSessionFactory(builder.buildServiceRegistry());

//1. Read class names
System.out.println("Enter first class names (make sure you enter fully qualified name): ");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String class1 = bufferedReader.readLine();
System.out.println("Enter second class names (make sure you enter fully qualified name): ");
String class2 = bufferedReader.readLine();

ClassMetadata classMetadata = null;

//2. Create ClassMetaData for the first class name and check that both the classes exists.
try {
classMetadata = sessionfactory.getClassMetadata(Class.forName(class1));
Class.forName(class2);
} catch (ClassNotFoundException classNotFoundException) {
System.err.println("Invalid class name.\nHint: Enter fully qualified class names for eg. packagename.Classname");
classNotFoundException.printStackTrace(System.err);
return;
}

//3. Retrieve all collection metada for collection type properties
@SuppressWarnings("unchecked")
Map<String, CollectionMetadata> allCollectionMetadata = sessionfactory.getAllCollectionMetadata();

//Retrieve all properties of the first class
String[] propertyNames = classMetadata.getPropertyNames();

//Loop through the retrieved properties
for (String name : propertyNames) {

//Retrieve type of each property
Type type = classMetadata.getPropertyType(name.trim());

//Check if the type is association type
if (type.isAssociationType()) {

//Check if it is collection type.
if (type.isCollectionType()) {

//From retrieved collection metadata (Strp 3) get value of the property we are refering to.
CollectionMetadata collectionMetadata = allCollectionMetadata.get(class1 + "." + name);

//Check if the elements of the collection are of desiered type
if (collectionMetadata.getElementType().getName().trim().equals(class2)) {
System.out.println("Property Name: " + name);
//Check if the value is of type OneToManyPersister
if (collectionMetadata instanceof OneToManyPersister) {
System.out.println("ONE TO MANY TYPE");
return;
} //Check if the value is of type BasicCollectionPersister. Note that for many to many relationship it would return an object of type BasicCollectionPersister.
else if (collectionMetadata instanceof BasicCollectionPersister) {
if (((BasicCollectionPersister) collectionMetadata).isManyToMany()) {
System.out.println("MANY TO MANY");
}
}
}
} //If property is not a collection then retrieve the class of the type and check if it is the same as Second class.
else if (type.getReturnedClass().getTypeName().equals(class2)) {
System.out.println("Property Name: " + name);
if (type instanceof ManyToOneType) {
System.out.println("MANY TO ONE TYPE");
return;
} else if (type instanceof OneToOneType) {
System.out.println("ONE TO ONE TYPE");
return;
}
}
}
}
System.out.println("NO RELATIONSHIP FOUND BETWEEN GIVEN CLASSES");
}
}

关于java - 如何在 hibernate 中检索关系映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26906438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com