Hier sind die Möglichkeiten, ein übergeordnetes Objekt in einem untergeordneten Objekt mit bidirektionalen Beziehungen zuzuweisen.
Angenommen, Sie haben eine Beziehung, die Eins-zu-Viele sagt, dann existiert für jedes übergeordnete Objekt eine Reihe von untergeordneten Objekten. In bidirektionalen Beziehungen verweist jedes untergeordnete Objekt auf sein übergeordnetes Objekt.
eg : Each Department will have list of Employees and each Employee is part of some department.This is called Bi directional relations.
Um dies zu erreichen, besteht eine Möglichkeit darin, Eltern im untergeordneten Objekt zuzuweisen, während das übergeordnete Objekt beibehalten wird
Parent parent = new Parent();
...
Child c1 = new Child();
...
c1.setParent(parent);
List<Child> children = new ArrayList<Child>();
children.add(c1);
parent.setChilds(children);
session.save(parent);
Eine andere Möglichkeit ist, Intercepter im Ruhezustand zu verwenden. Auf diese Weise können Sie nicht für alle Modelle den obigen Code schreiben.
Hibernate Interceptor bietet APIs, mit denen Sie Ihre eigene Arbeit erledigen können, bevor Sie eine DB-Operation ausführen. Ebenso können wir unter Speichern von Objekten übergeordnete Objekte in untergeordneten Objekten mithilfe von Reflektion zuweisen.
public class CustomEntityInterceptor extends EmptyInterceptor {
@Override
public boolean onSave(
final Object entity, final Serializable id, final Object[] state, final String[] propertyNames,
final Type[] types) {
if (types != null) {
for (int i = 0; i < types.length; i++) {
if (types[i].isCollectionType()) {
String propertyName = propertyNames[i];
propertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
try {
Method method = entity.getClass().getMethod("get" + propertyName);
List<Object> objectList = (List<Object>) method.invoke(entity);
if (objectList != null) {
for (Object object : objectList) {
String entityName = entity.getClass().getSimpleName();
Method eachMethod = object.getClass().getMethod("set" + entityName, entity.getClass());
eachMethod.invoke(object, entity);
}
}
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
}
return true;
}
}
Und Sie können Intercepter für die Konfiguration als registrieren
new Configuration().setInterceptor( new CustomEntityInterceptor() );