2011-06-13 5 views
2

Hibernate, BatchTransaction 및 Transaction을 사용하여 데이터베이스의 테이블에 매핑되는 몇 개의 객체가 있습니다. BatchTransaction의 테이블 (batch_transactions)에는 transaction_id라는 트랜잭션에 대한 외래 키 참조가 있습니다.Hibernate를 통해 외래 키 값을 직접 업데이트하는 방법은 무엇입니까?

이전에는 트랜잭션이 완료되면 내부 호출을 사용하여 배치 트랜잭션을 실행하고 BatchTransaction에서 Transaction으로 참조를 완료하는 배치 러너를 사용했습니다. 트랜잭션이 삽입 된 후에는 batchTransaction.setTransaction (txn)을 호출하기 때문에 BatchTransaction에서 Transaction으로 @ManyToOne 매핑을 갖습니다.

웹 서비스를 통해 트랜잭션을 실행하도록 배치 러너를 변경하려고합니다. 새로 삽입 된 트랜잭션의 ID가 서비스에 의해 반환되고 BatchTransaction에서 transaction_id를 직접 업데이트하려고합니다 (BatchTransaction의 Transaction 필드에 setter를 사용하지 않고 새로 삽입 한 항목을 불필요하게로드해야 함).

하이버 네이트보다는 SQL을 사용하는 것이 가장 논리적 인 방법 인 것처럼 보이지만 좀 더 우아한 접근 방법이 있는지 궁금합니다. 어떤 아이디어?


다음은 기본 매핑입니다.

BatchQuery.java

@Entity 
@Table(name = "batch_queries") 
public class BatchQuery 
{ 
    @ManyToOne 
    @JoinColumn(name = "query_id") 
    public Query getQuery() 
    { 
     return mQuery; 
    } 
} 

Query.java

@Entity 
@Table(name = "queries") 
public class Query 
{ 
} 

아이디어는 BatchQuery 개체에 "쿼리"속성을 설정하지 않고 batch_queries에서 query_id 열을 업데이트하는 것입니다.

+0

은 참조 용 HBM 파일을 넣을 수 있습니다. 그런 다음 살펴볼 수 있습니다. –

+0

어노테이션을 사용하기 때문에 HBM 파일이 없습니다. 그래도 매핑을 추가하겠습니다. – Rafe

+0

아래 나의 답변보기 –

답변

1

직접 SQL 업데이트 또는 HQL 업데이트를 사용하는 것이 확실히 가능합니다.

전체적인 문제는 보이지 않지만 내 도메인에서 문서화 할 가치가있는 도메인을 수정하고있는 것처럼 보입니다. 전체 트랜잭션이 아니라 TransactionId 만 멤버로 갖는 BatchTransaction으로 이동 중일 수 있습니다.

다른 활동에서 BatchTransaction이 여전히 해당 트랜잭션을 수화 할 필요가 있다면 TransactionId에 별도의 매핑을 추가하고 관리 매핑 (트랜잭션 연결을 업데이트하고 거짓 삽입)을 수행하는 것이 좋습니다.

BatchTransaction이 더 이상 전체 트랜잭션과 관련되지 않으면 TransactionId 필드를 추가 한 후 해당 트랜잭션을 제거하십시오.

0

여러분이 writeen을 했으므로 위의 문제에 대한 해결책을 얻기 위해 SQL을 사용할 수 있습니다. 하지만 SQL을 통해 기본 키를 업데이트하지 않을 것을 제안합니다.

이제 키를 변경하면 새 개체가 모두 생성되므로이 키를 사용하여 이전 키를 사용하여 기존 개체를 삭제 한 다음 업데이트 된 개체로 새 개체를 삽입 할 수 있습니다 key (귀하의 경우 transaction_id)