0

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

我的课程是:

Listener, ListenerPK
Actuator, ActuatorPK
DeviceState, DeviceStatePK

其中 ListenerPK 包含一个 DeviceStatePK 实例和一个字符串,而 ActuatorPK 包含一个 ListenerPK 实例和一个 DeviceStatePK 实例。

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

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

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

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

4

2 回答 2

0

从它的声音来看,Actuator 的表包含一个外键,但您已将它映射到 Listener 和 DeviceState 实体。由于 Listener 的 pk 已经包含对 DeviceState 的引用,因此可以表示对象模型,即 Actuator 引用一个引用 DeviceState 的 Listener。不需要执行器PK;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

于 2013-09-23T16:12:43.887 回答
0

为了解决这个问题,我想说我正在使用连接表。我不确定是什么导致了最初的错误,但我认为 JPA 假设我的两个相同类型的实体实际上是同一个实体。

于 2013-10-02T12:37:30.820 回答