我花了一些时间搜索,但没有得到满意的结果。
我的课程是:
Listener, ListenerPK
Actuator, ActuatorPK
DeviceState, DeviceStatePK
其中ListenerPK包含DeviceStatePK和String的实例,ActuatorPK包含ListenerPK的实例和DeviceStatePK的实例。
因此Actuator包含一个Listener和一个DeviceState(都标记为@ Id,@ ManyToOne),Listener包含一个DeviceState和一个String(@Id,@ ManyToOne)。
我的问题是在JPA中,当我这样做时,我得到如下例外:
异常说明:字段XXX存在多个可写映射。只有一个可以被定义为可写,所有其他的必须被指定为只读。
我看不到存在多个可写映射的位置。我明显错了吗?
答案 0 :(得分:0)
从它的声音来看,Actuator的表包含一个外键,但你将它映射到Listener和DeviceState实体。由于Listener的pk已经包含对DeviceState的引用,因此可以表示对象模型,使得Actuator引用引用DeviceState的Listener。不需要ActuatorPK; Actuator只能使用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参考获得与Actuator关联的DeviceState。或者,您可以在Actuator中将其映射为只读:
@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
答案 1 :(得分:0)
要解决这个问题,我想说我正在使用连接表。我不确定导致原始错误的原因,但我认为JPA假设我的两个相同类型的实体实际上是同一个实体。