2009-08-26 3 views
2

마지막 비즈니스 트랜잭션 중에 업데이트 된 데이터를 기반으로 서로 다른 유형의 관련성을 가질 수있는 데이터베이스가 있습니다. 예를 들어 정책 작성 응용 프로그램에있을 수 있습니다. 기본 테이블에는 일반 정책 수준 정보가 들어 있으며 에이전트의 정보 및 피보험자 정보와 같은 정보가 들어있는 관련 테이블이 있습니다. 첫 번째 트랜잭션이 발행되면 모든 테이블이 채워지지만 후속 트랜잭션에서는 업데이트가있는 테이블 만 데이터베이스에 유지됩니다. 지금은 JPA를 구현하는 클래스를 작성하여 테이블 간의 관계를 일대일로 정의합니다. 그런 다음 각 관계에 대한 사용자 지정 로더를 구현하여 정책 엔티티를 검색 할 때마다 해당 테이블의 최신 버전을 검색 할 수 있는지 확인해야합니다. 누구든지이 논리를 구현하는 방법을 알고 있습니까? 나는 @NamedNativeQuery을 사용하고 HQL을 사용해 보았습니다. 그러나 두 경우 모두 내가 지정한 열 이름이 존재하지 않는다고 알려줍니다.사용자 정의 OneToOne Hibernate/JPA Association

도움을 주시면 감사하겠습니다.

내가하는 일을 설명하기 위해 아래에 코드가 제공되었습니다. 위의 예에서

@Entity 
@NamedNativeQuery(name = "loadLatestBilling", 
        query = "Select {i.*} from TransactionSummary as ts outer join BillingInfo i on i.systemAssignId=ts.systemAssignId where ts.systemAssignId=:systemAssignId and i.transSeqNo<=:transSeqNo order by i.systemAssignId, i.transSeqNo DESC", 
        resultClass = BillingInfo.class) 

public class CoTransactionSummary implements java.io.Serializable, 
    CdbCoTransactionSummary { 


@OneToOne(targetEntity = BillingInfo.class, fetch = FetchType.LAZY) 
@org.hibernate.annotations.NotFound(action = org.hibernate.annotations.NotFoundAction.IGNORE) 
@Loader(namedQuery = "loadLatestBilling") 
public BillingInfo getBillingInfo() { 
    return billingInfo; 
} 

public void setBillingInfo(BillingInfo billingInfo) { 
    this.billingInfo= billingInfo; 
} 

}

SystemAssignId는 그 엔티티에 속하는 모든 레코드에 공통 것이다. 각 연속 트랜잭션마다 transSeqNo가 증가하므로 사용자 정의 로더는 systemAssignId와 연관된 가장 높은 값을 찾습니다.

제공 할 수있는 도움에 감사드립니다.

답변

2

명명 된 쿼리가 잘못되었습니다. 이름이 지정된 쿼리를 사용할 수 없습니다. 기본 키 값으로 대체 될 하나의 위치 매개 변수 만 가질 수 있습니다 (복합 ID에는 둘 이상이어야하지만 귀하의 경우에는 적용되지 않을 수 있음). 나는 또한 하나 이상의 가치를 반환하는 것이 합법이라고 생각하지 않는다. Hibernate가 슬라이드를 허용 할지라도.

이제는 쿼리가 PK (BillingInfo PK)를 기반으로해야하기 때문에 일대일 매핑을 통해 원하는 작업을 수행하는 것이 쉽지 않습니다 (물론 CoTransactionSummary을 실제로 업데이트하지 않는 한 적절한 BillingInfo을 가리킬 수 있지만이 경우 사용자 지정로드하는 모든 항목이 필요하지 않습니다. 기본적으로 BillingInfo 테이블에 두 번 가입하도록 쿼리를 다시 작성해야합니다. TransactionSummary PK의 BililngInfo PK를 최대 절전 모드에서 제공하고 두 번째로 최신 BillingInfo 레코드를 얻으려면 처음으로 테이블을 두 번 다시 작성해야합니다. 모든 것이 다소 난잡 해 보입니다.

대신 one-to-many 매핑을 사용해보세요. BillingInfo 컬렉션을 비공개로 설정하고 공개 getBillingInfo() 방법으로 적절한 인스턴스 만 노출 할 수 있습니다.