Ось способи призначення батьківського об’єкта в дочірньому об’єкті двонаправлених відносин?
Припустимо, у вас є відношення скажіть "Один-до-багатьох", тоді для кожного батьківського об'єкта існує набір дочірнього об'єкта. У двонаправлених відносинах кожен дочірній об’єкт матиме посилання на свого батька.
eg : Each Department will have list of Employees and each Employee is part of some department.This is called Bi directional relations.
Для досягнення цього одним із способів є присвоєння батьків у дочірньому об’єкті, зберігаючи батьківський об’єкт
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);
Інший спосіб полягає в тому, що ви можете використовувати Hibernate Intercepter, цей спосіб допомагає вам не писати код вище для всіх моделей.
Гібернаційний перехоплювач надає apis для самостійної роботи перед виконанням будь-якої операції з БД. Так само onSave об'єкта, ми можемо призначити батьківський об'єкт у дочірніх об'єктах за допомогою відображення.
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;
}
}
І ви можете зареєструвати Intercepter для конфігурації як
new Configuration().setInterceptor( new CustomEntityInterceptor() );