2011-12-29 2 views
0
에 다 대다 관계와 객체의 일부 COLS을로드하는 방법을

최대 절전 모드를 사용하여 데이터베이스에서 개체를로드에 문제가 있습니다. "A", "B"와 "C"최대 절전 모드

나는 세 개의 자바 클래스를 가지고있다. A와 B은 추가 테이블 "a_join_b"에 의해 mamy-to-many 관계로 연관됩니다. A와 C은 다 대일 관계로 연결됩니다.

@Entity 
@Table(name = "A") 
public class AclassEnt implements java.io.Serializable{ 
@Id 
    @TableGenerator(name = "inventory", 
     table = "hibernate_sequences", 
     pkColumnName = "sequence_name", 
     pkColumnValue = "Emp_Gen", 
     valueColumnName = "sequence_next_hi_value", 
     initialValue = 0, 
     allocationSize = 100) 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @Column(name = "A_ID", nullable = false) 
    private Integer aId; 

    @Column(name = "A_NUMBER", length = 20) 
    private String aNumber; 

    @Column(name = "A_NAME", length = 15) 
    private String aName; 

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, 
       fetch = FetchType.EAGER, 
       targetEntity=WorkersEnt.class) 
    @JoinColumn(name="C_ID") 
    private CclassEnt cclass; 

    @ManyToMany(cascade = CascadeType.REFRESH,fetch = FetchType.LAZY,targetEntity = BclassEnt.class) 
    @JoinTable(name = "A_join_B", joinColumns = { @JoinColumn(name = "A_ID") }, inverseJoinColumns = { @JoinColumn(name = "B_ID") }) 
    private Set<BclassEnt> BclassList=new HashSet<BclassEnt>(); 

    //getters and settrs 
} 



@Entity 
@Table(name = "B") 
public class MeasureTypeEnt implements java.io.Serializable{ 

@Id 
    @TableGenerator(name = "inventory", 
    table = "hibernate_sequences", 
    pkColumnName = "sequence_name", 
    pkColumnValue = "Emp_Gen", 
    valueColumnName = "sequence_next_hi_value", 
    initialValue = 0, 
    allocationSize = 100) 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @Column(name = "B_ID", nullable = false) 
    private Integer bId; 

    @Basic(optional = false) 
    @Column(name = "B_NAME", nullable = false, length = 100) 
    private String bName; 

    //getters and setters 
} 

질문 :

코드가 어떻게 hext 필드와 객체 "AclassEnt"를로드 할 수 원조, aName, cclass 및 BclassList ??? 나는 마지막 exept 필요한 모든 COLS을로드 할 수 있습니다 다음 코드를 사용하여

. 나는 "BclassList"를 의미합니다.

Criteria crit = session.createCriteria(AclassEnt.class,"c"); 
crit.createAlias("cclass", "cclass") 
    .createAlias("BclassList", "BclassList")//<-- is it correctly? 
    .setProjection(Projections.projectionList() 
    .add(Projections.property("c.aId").as("aId")) 
    .add(Projections.property("c.aName").as("aName")) 
    .add(Projections.property("c.cclass").as("cclass")) 
    .add(Projections.property("c.BclassList").as("BclassList"))//<-- is it correctly? 
    ); 

AclassEnt result = crit.setResultTransformer(new AliasToBeanResultTransformer(AclassEnt.class)).list(); 
+0

불가능합니다. 기준 쿼리는 스칼라 또는 엔터티를 반환하지만 둘 모두를 반환하지는 않습니다. 하지만 당신 쿼리는 aNumber를 제외하고 A와 B, C를 포함한 모든 것을로드하는 것으로 보입니다. 왜 열이로드되지 않게해야합니까? –

+0

JB Nizet, 단지 예일뿐입니다. Aclass의 실제 프로그램에서 20 개 이상의 열. 이제는 간단한 보고서를 만들어야하는데, 그 중 일부만 사용합니다. 나는 단지 5 ~ 6 개가 필요할 때 전체 객체 (23 개 열)를로드하는 것이 잘못되었다고 생각합니다. – Vadim

+0

그런 다음 B 및 C 속성에 대한 투영을 작성하고 직접 개체 그래프를 다시 만들어야합니다. 23 열에 대해서는별로 신경 쓰지 않을 것입니다. 그것들을 얻는 비용은 아마도 조인으로 질의를 실행하는 비용에 비해 무시할 만하다. –

답변

0

당신은 단지 클래스의 게터와 B 엔티티 목록에 액세스 할 수 있어야합니다. 당신의 경우 Set myAobject.getbClassList();

그래서 당신은 단지를 A 엔티티를 검색 쿼리/기준을 만들어야합니다. 그 후에, 당신의 세트의 게터를 불러 세트로 작동하십시오. 복잡한 쿼리를 작성할 필요가 없습니다. 예 : currentSession(). get (AclassEnt.class, 1); 또는 currentSession(). createCriteria (AclassEnt.class) .list(); ...

그러나 당신은 lazy 페칭이 있고 트랜잭션 외부에서 액세스하려고하면, 당신은 lazyexceptions를 얻을 수 있습니다,주의하십시오. 해결 방법은 게으른 가져 오기를 열망하도록 만드는 것입니다. Set를 인스턴스화 할 필요가 없습니다. 나는이 문서를 확인할 수 있도록

나는 확신했지만, 당신의 일방향 운전의 ManyToMany 관계 정의는 올바른 보인다 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ 2.2.5.3.2. 다 대 다