包含两个相同类型项的复合键

时间:2013-09-23 15:37:07

标签: java jpa eclipselink

我花了一些时间搜索,但没有得到满意的结果。

我的课程是:

Listener, ListenerPK
Actuator, ActuatorPK
DeviceState, DeviceStatePK

其中ListenerPK包含DeviceStatePK和String的实例,ActuatorPK包含ListenerPK的实例和DeviceStatePK的实例。

因此Actuator包含一个Listener和一个DeviceState(都标记为@ Id,@ ManyToOne),Listener包含一个DeviceState和一个String(@Id,@ ManyToOne)。

我的问题是在JPA中,当我这样做时,我得到如下例外:

异常说明:字段XXX存在多个可写映射。只有一个可以被定义为可写,所有其他的必须被指定为只读。

我看不到存在多个可写映射的位置。我明显错了吗?

2 个答案:

答案 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假设我的两个相同类型的实体实际上是同一个实体。