문제

본인은 본질적으로 많은 컬렉션 주변의 래퍼 일뿐입니다.

따라서 수업은 다음과 같은 것입니다 (대량 단순화/의사).

@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를 사용하여 동일한 작업을 수행하십시오. 보다 스프링과 최대 절전 모드를 갖춘 도메인 구동 설계

다른 전략을 알고 있다면 우리와 공유하십시오.

문안 인사,

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top