2011-02-11 3 views
3

엔티티가 있습니다. 그리고 때로는이 오브젝트가 어떤 가치를 지니고 있는지, '깊이'라고 부를 필요가 있습니다. 쿼리는 'select b.id, b.name, b..., count(c.id) as depth from Entity b, CEntity c where ...'처럼 보일 수 있습니다. 그래서 Entity를 확장하는 NonHibernateEntity 클래스를 만들었습니다. 그리고 위의 쿼리 결과는 EntHy의 모든 필드 (확장 됨) 및 속성 '깊이'로 구성된 NonHibEntity의 List로 완벽하게 저장됩니다. aliasToBean results transformer를 설정하여 만듭니다. .setResultTransformer(Transformers.aliasToBean(NHEntity.class)). 그러나 필요한 모든 필드의 별칭을 지정하는 것은 짜증나고 불편합니다. 그리고이 객체 중 하나를 DB-session.saveOrUpdate((Enity)nHibEntity)에 저장하려면 nHibEntity가 Hibernate Entity가 아니라는 예외가 있습니다.@Entity 클래스에 DB에 포함 된 속성을 추가하는 방법은 무엇입니까?

NonHibEntity (aggregation, inheritance) 필드에 'entity'를 저장하는 것에 대해 들었습니다. 그러나 이것은 다소 불편한 것 같습니다. 당신은 어떻게 생각하십니까? 적절한 해결책은 무엇입니까?

답변

0

나는 그런 방식으로이 문제 해결 :

단지 @Transient로이 계산 된 필드를 만들어

등을 다음

List<BaseEntry> result = new ArrayList<BaseEntry>(); 
    Iterator it = session() 
    .createQuery("select b, (select count(p.id) as depth from BaseEntry p " + 
      " where ...) as d" + 
      " from BaseEntry b " + 
      " where ... ") 
    .list().iterator(); 
    while (it.hasNext()) { 
     Object[] row = (Object[]) it.next(); 
     BaseEntry entry = (BaseEntry) row[0]; 
     Long d = (Long) row[1]; 
     entry.setD(d); 
     result.add(entry); 
    } 
    return result; 

그것은 잘 작동하고, 그것을 할 수 있다는 것 나중에 쉽게 지원됩니다

1

Formula 컬럼 매핑이 사용자의 요구에 적합 할 수 있습니다. 나는 이것을 먼저 시도 할 것이다.

두려움에 따라 성능 문제가 발생하는 경우이 필드가 하위 인 경우 매핑 된 클래스 계층 구조를 시도하고 두 테이블을 같은 테이블에 매핑 할 수 있습니다. 이것이 실제로 효과가 있을지 확신하지 못합니다 ...

마지막으로 매핑되지 않은 클래스를 사용하지만 엔터티를 다른 클래스의 필드로 사용합니다 (상속 대신 집계). 맵핑되지 않은 맵핑 된 엔티티를 검색하여 저장할 수있는 방법이 있는지 확인하십시오. Decorator으로 만드는 것이 현명 할 것이므로 하위 클래스와 집계 모두이므로 코드의 상당 부분에서 계속 구분할 수 있습니다.

그러나 매핑되지 않은 하위 클래스 및/또는 집계를 사용하면 저장할 때 엔터티를 꺼내야합니다. - 누군가가 알고 싶은 경우

+0

하지만이 열은 내 객체 ffrom db를 얻을 때마다 계산됩니다. 나는이 칼럼이 가끔 필요합니다. 매번 계산하면 성능이 저하 될 수 있습니다. – javagirl

관련 문제