큰 최대 절전 모드 클래스를 깨뜨립니다
-
19-09-2019 - |
문제
본인은 본질적으로 많은 컬렉션 주변의 래퍼 일뿐입니다.
따라서 수업은 다음과 같은 것입니다 (대량 단순화/의사).
@Entity public class MyClass { @OneToMany Map1 @OneToMany Map2 @OneToMany Map3 AddToMap1(); AddToMap2(); AddToMap3(); RemoveFromMap1(); RemoveFromMap2(); RemoveFromMap3(); DoWhateverWithMap1(); DoWhateverWithMap2(); DoWhateverWithMap3(); }
그런 다음 각 맵에는 몇 가지 방법이 있습니다 (추가/제거/interrogate/etc).
당신이 상상할 수 있듯이, 내가 10 번째 컬렉션을 추가 할 때까지, 수업의 크기는 약간 어리석은 것입니다.
내가하고 싶은 것은 다음의 선을 따라 무언가입니다.
@Entity public class MyClass { ClassWrappingMap1; ClassWrappingMap2; ClassWrappingMap3; }
해당 수업에서 모든 다양한 방법이 마무리됩니다.
public class ClassWrappingMap1 { @OneToMany Map AddToMap(); RemoveFromMap(); DoWhateverWithMap(); }
나는 아마 내가 사용할 수 있다고 생각했다 @Embedded
이를 위해서는하지만 작동 할 수없는 것 같습니다 (최대 절전 모드는 단순히 래퍼 클래스 내부의지도를 지속하려고하지 않습니다).
누군가 전에 이런 일을 해본 적이 있습니까? 힌트가 있습니까?
많은 감사,
네드
해결책
주석을위한 최대 절전 모성 다음 상태 :
EJB3 사양에 의해 지원되지는 않지만 최대 절전 모드 주석을 사용하면 임베디 가능한 물체 (예 : @*toone 또는 @*tomany)에서 연관 주석을 사용할 수 있습니다. 연결 열을 무시하려면 @associationOverride를 사용할 수 있습니다.
따라서 래핑 방식이 작동해야합니다.
우선, 모든 로그 파일 등에 관련 오류가 있는지 확인해야합니다.
당신은 다음과 같은 것을 시도 할 수 있습니다 :
- 마스터 클래스 (MyClass)에서
@Entity public class MyClass { @Embedded ClassWrappingMap1 map1; }
- 그리고 당신의 포장 클래스에서
@Embeddable public class ClassWrappingMap1 { @OneToMany Map map1; }
그것을주의해라 ClassWrappingMap1
용도 @Embeddable
주석. 그러나 문서에 따르면 @embeddable 주석이 필요하지 않아야합니다. @embedded 주석이 사용될 때 기본값이어야합니다.
모든 ClassWrappingMap 클래스가 데이터베이스에서 다른 열을 매핑해야합니다. 또한 ClassWrappingMap 클래스에는 기본 키가 없어야합니다 (@Id
또는 @EmbeddedId
열).
다른 팁
래퍼 클래스를 사용할 때는 기본 전략을 모르지만 최대 절전 모드 인터셉터를 사용하여 재정의하여 래퍼를 초기화 할 수 있습니다. 길 위에 방법. 같은 것
public class WrapperInterceptor extends EmptyInterceptor {
private Session session;
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
if (entity instanceof MyClass) {
MyClass myClass = (MyClass) entity;
Query query = session.createQuery(<QUERY_TO_RETRIEVE_WRAPPED_ENTITY_GOES_HERE>);
WrappedEntity wrappedEntity = query.list().get(0);
myClass.setWrapperClass(new WrapperClass(wrappedEntity));
}
}
public void setSession(Session session) {
this.session = session;
}
}
다음을 처리합니다.
이 인터셉터를 사용하는 클라이언트는 세션 속성을 설정해야합니다
그래서 당신의 코드는이 코드처럼 보입니다
WrapperInterceptor interceptor = new WrapperInterceptor();
Session session = sessionFactory().openSession(interceptor);
Transaction tx = session.beginTransaction();
interceptor.setSession(session);
MyClass myClass = (MyClass) session.get(newItem, myClassId); // Triggers onLoad event
tx.commit();
session.close();
또는 Spring AOP를 사용하여 동일한 작업을 수행하십시오. 보다 스프링과 최대 절전 모드를 갖춘 도메인 구동 설계
다른 전략을 알고 있다면 우리와 공유하십시오.
문안 인사,