2013-09-23 3 views
0

검색하는 데 시간을 보냈지만 만족스러운 결과를 얻지 못했습니다.동일한 유형의 항목이 두 개인 복합 키

내 클래스는 다음과 같습니다 ListenerPK가 DeviceStatePK와 문자열의 인스턴스를 포함하고 ActuatorPK는 ListenerPK의 인스턴스 및 DeviceStatePK의 인스턴스를 포함

Listener, ListenerPK 
Actuator, ActuatorPK 
DeviceState, DeviceStatePK 

.

그래서 액츄에이터에는 Listener와 DeviceState (모두 @Id, @ManyToOne으로 표시)가 있으며 Listener에는 DeviceState와 String (@Id, @ManyToOne)이 있습니다.

예외 설명 : 여러 쓰기 가능한 매핑 필드 XXX 존재

내 문제는 내가이 작업을 수행 할 때 다음과 같이 JPA에, 나는 예외를 얻을 수 있다는 것입니다. 하나만 쓰기 가능으로 정의 할 수 있으며 나머지는 모두 읽기 전용으로 지정해야합니다.

쓰기 가능한 여러 매핑이 어디에 있는지 알 수 없습니다. 나는 분명히 여기에 잘못 가고 있나?

+0

엔티티와 코드를 표시하고 싶습니까? 예외의 필드는 무엇이며 어떻게 매핑합니까? 귀하의 테이블 구조는 어떻게 생겼습니까? 내 생각 엔 액추에이터 -> devicestate가 여러 번 매핑 된 것입니다. – Chris

답변

0

는이 문제를 해결하려면, 나는이 테이블 조인 사용하고 있음을 말하고 싶었다. 원본 오류를 일으키는 원인이 무엇인지 확신 할 수 없지만 JPA에서 동일한 유형의 두 엔티티가 실제로 동일한 엔티티라고 가정한다고 생각합니다.

0

액추에이터의 테이블에는 외래 키가 하나 있지만 Listener와 DeviceState 엔티티 모두에 매핑되어 있습니다. Listener의 pk에는 이미 DeviceState에 대한 참조가 포함되어 있으므로 액츄에이터가 DeviceState를 참조하는 Listener를 참조하도록 객체 모델을 나타낼 수 있습니다. ActuatorPK는 필요하지 않습니다. 액츄에이터는 ListenerPK 클래스를 기본 키로 사용할 수 있습니다. 두 테이블 모두 DeviceStatePK와 String을 기본 키로 사용하기 때문입니다.

@Entity 
@IdClass(ListenerPK.class) 
public class Actuator { 
    @Id 
    @OneToOne 
    Listener listener; 
    .. 
} 
@Entity 
@IdClass(ListenerPK.class) 
public class Listener{ 
    @Id 
    @ManyToOne 
    DeviceState deviceState; 
    @Id 
    String stringId; 
    .. 
} 

사용자는 Listener 참조를 통해 액추에이터와 연결된 DeviceState를 얻을 수 있습니다. 또는 당신은이 읽기 전용 액츄에이터 내에서 매핑 할 수 있습니다 :

@Entity 
@IdClass(ListenerPK.class) 
public class Actuator { 
    @Id 
    @OneToOne 
    Listener listener; 
    @ManyToOne 
    @JoinColumn(name="deviceState_id", insertable=false, updatable=false) 
    DeviceState deviceState; 
    .. 
} 

http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers