【发布时间】:2015-06-03 02:36:23
【问题描述】:
您好,我有以下代码(使用 eclipselink 2.6):
传输:
@Entity
public class Transmission {
@Column(name="TRANSMISSION_ID")
@Id private Long id;
@Column(name="TRANSMISSION_CONTENT")
private String content;
....
}
HeaderPk:
@Embeddable
public class HeaderPk {
// this is a foreign key to "TRANSMISSION_ID" in Transmission
@Column(name="FK_TRANSMISSION_ID")
private Long transmissionId;
@Column(name="MAILBOX_ID")
private String mailboxId;
@Column(name="TRANSMISSION_TIME")
private Time transmissionTime;
...
}
标题:
@MappedSuperclass
public abstract class Header {
@EmbeddedId
private HeaderPk id = new HeaderPk();
@MapsId("transmissionId")
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="FK_TRANSMISSION_ID", referencedColumnName="TRANSMISSION_ID")
private Transmission transmission;
....
}
VoucherHeader:
@Entity
public class VoucherHeader extends Header {
// a bunch of additional fields
....
....
}
RecordPk:
@Embeddable
public class RecordPk {
@Column(name="RECORD_NUMBER")
private Integer recordNumber;
@Embedded
private HeaderPk headerPk;
...
...
}
记录:
@MappedSuperclass
public abstract class Record<T> {
@EmbeddedId
private RecordPk id;
@MapsId("headerPk")
@ManyToOne
@JoinColumns({
@JoinColumn(name="FK_TRANSMISSION_ID", referencedColumnName="FK_TRANSMISSION_ID"),
@JoinColumn(name="FK_MAILBOX_ID", referencedColumnName="MAILBOX_ID"),
@JoinColumn(name="FK_TRANSMISSION_TIME", referencedColumnName="TRANSMISSION_TIME")
})
private T header;
....
....
}
VoucherRecordTypeA:
@Entity
public class VoucherRecordTypeA extends Record<VoucherHeader> {
// a bunch of additional column-mapped fields
...
}
尝试运行程序时出现以下错误: 应该为主键字段 [VoucherRecordTypeA.MAILBOX_ID] 定义一个非只读映射...我知道它抱怨有多个可写映射字段,但我无法弄清楚如何解决这个问题。
如果我将 VoucherRecordTypeA 修改为此错误就会消失...
@Entity
public class VoucherRecordTypeA {
@EmbeddedId
private RecordPk id;
@MapsId("headerPk")
@ManyToOne
@JoinColumns({
@JoinColumn(name="FK_TRANSMISSION_ID", referencedColumnName="FK_TRANSMISSION_ID"),
@JoinColumn(name="FK_MAILBOX_ID", referencedColumnName="MAILBOX_ID"),
@JoinColumn(name="FK_TRANSMISSION_TIME", referencedColumnName="TRANSMISSION_TIME")
})
private VoucherHeader header;
// a bunch of additional column-mapped fields
...
}
但理想的解决方案是让 VoucherRecordTypeA 扩展 Record<...>,因为还有几个其他类类似于 VoucherRecordTypeA。任何帮助将不胜感激。
编辑 尝试了以下
@MappedSuperclass
public abstract class Record {
@EmbeddedId
private RecordPk id;
@MapsId("headerPk")
@ManyToOne
@JoinColumns({
@JoinColumn(name="FK_TRANSMISSION_ID", referencedColumnName="FK_TRANSMISSION_ID"),
@JoinColumn(name="FK_MAILBOX_ID", referencedColumnName="MAILBOX_ID"),
@JoinColumn(name="FK_TRANSMISSION_TIME", referencedColumnName="TRANSMISSION_TIME")
})
private VoucherHeader header;
....
....
}
同样的错误。我注意到它抱怨应该为 [VoucherRecordTypeA.MAILBOX_ID] 定义非只读映射...表 VoucherRecordTypeA 具有列 FK_MAILBOX_ID 而不是 MAILBOX_ID...MAILBOX_ID 是VoucherHeader 表。
【问题讨论】:
-
很难判断出了什么问题。您可以尝试删除映射中的泛型,看看这是否会以某种方式混淆问题
-
@Chris 我删除了泛型但同样的错误。查看我编辑的帖子。
标签: jpa mapping eclipselink