2011-08-28 4 views
0

현재 대부분의 시간 동안 작동하는 OpenJPA를 사용하여 데이터베이스와 Java 응용 프로그램으로 스키마를 설정했지만 일부 사용자의 경우 오류가 발생하는 경우가 있습니다.JPA : InvalidStateException 오류 + 복합 키/EmbeddableId/시퀀스 생성 ID

org.apache.openjpa.persistence.InvalidStateException 두 개의 상이한 값

표 실제로 복합 키 (두 값)와 그 키의 각 값을 갖는 칼럼 "table1.ID"를 설정하려고하면 외래 키 다른 테이블로. RSA (Rational Software Architect)를 사용하여 엔티티를 설정했습니다 (생성 된 코드). 그것은 PK1 클래스를 (PK 클래스를 참조하기 위해 @EmbeddableId를 사용하여) table1에 대한 Entity 클래스에서 설정하고, 두 개의 @ManyToOne 관계를 동일한 table1 Entity 클래스에서 (그리고 이들 열이 참조하는 엔티티 클래스에서도) 설정합니다. 외래 키

이제 위에서 언급했듯이 복합 키의 각 값은 외래 키입니다. 음, 각각의 외래 키는 실제로 자체 엔티티 클래스에서 외부 시퀀서를 사용하여 생성됩니다. 나는 DB2를 사용하고 열에 @GeneratedValue (즉, table2 및 table3의 엔티티 클래스에있는 ID)를 사용하고 있습니다. 나는 각각에 대해 strategy = GenerationType.SEQUENCE를 사용한다.

다시 한 번 모든 것이 일반적으로 작동하지만 100 %는 작동하지 않으며 이유가 확실하지 않습니다. 모든 것을 닦아서 시퀀스 생성기를 재설정하여이 오류를 없애 버렸지 만 이것이 분명히 해결책이 아닙니다. 데이터베이스의 두 개의 복합 키 값이 시퀀스를 사용하여 생성 된 열에 대한 외래 키이지만 PK 엔터티가 알 수없는 사실과 관련이있을 수 있습니까?

사용자 테이블에 레코드가있는 사용자 (위에서 언급 한 외래 키 중 하나는 Users 테이블에 대한 것이고 다른 FK는 다른 테이블에 대한 것임)에 대해서만 작동한다는 것을 알았습니다.

당신이 일을 끝낼
User newUser = userManager.getNewUser(); 
newUser.setName(..); 
newUser.setEmail(..); 
... 

, 내가 위에서 언급 한 PK 클래스는 다음 다른로라고 만든의 새로운 인스턴스를 가지고 : 사용자가 테이블에없는 경우 어떻게됩니까, 그것은 하나, 같은 것을 만들어 표. 위 사용자의 ID가 PK로 전달됩니다. 좋아요 :

PK newPK = pkManager.getNewPK(); 
newPk.setAID(newUser.getID()); 

누구에게이 문제가 있습니까? 어떤 해결책?

답변

0

죄송합니다. 문제가 해결되었습니다. 내 코드를 살펴보고 코드 한 줄 (데이터 모델 변경)을 리팩토링하는 것을 잊었다는 것을 깨달았다.