양방향 관계의 자식 개체에 부모 개체를 할당하는 방법은 다음과 같습니다.
일대 다라는 관계가 있다고 가정하면 각 상위 개체에 대해 하위 개체 집합이 존재합니다. 양방향 관계에서 각 자식 개체는 부모에 대한 참조를 갖습니다.
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 인터셉터는 DB 작업을 수행하기 전에 자신의 작업을 수행 할 수있는 API를 제공합니다. 객체의 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() );