Вот способы присвоения родительского объекта в дочернем объекте двунаправленных отношений?
Предположим, у вас есть отношение, скажем, One-To-Many, тогда для каждого родительского объекта,набор дочерних объектов существует.В двунаправленных отношениях каждый дочерний объект будет иметь ссылку на своего родителя.
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, этот способ поможет вам не писать вышеуказанный код для всех моделей.
Перехватчик Hibernate предоставляет apis для выполнения вашихсобственная работа перед выполнением любой операции с БД. Аналогично при сохранении объекта мы можем назначить родительский объект в дочерних объектах с помощью отражения.
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() );