这是相关的 JPA 代码:
@MappedSuperClass
public abstract class SuperClass {
@EmbeddedId
private FileId fileId;
protected SuperClass() {
}
public SuperClass(FileId fileId) {
this.fileId = fileId;
}
}
@Embeddable
public class FileId {
protected FileId() {
}
protected File fileName;
public FileId(File fileName) {
this.fileName = fileName;
}
}
@Entity
public MyClass1 extends SuperClass {
@Id
protected String id;
protected MyClass1() {
}
public MyClass1(String id, FileId fileId) {
super(fileId);
this.id = id;
}
}
@Entity
public MyClass2 extends SuperClass {
protected MyClass2() {
}
public MyClass2(FileId fileId) {
super(fileId);
}
}
在运行时,我得到以下异常:
...
Exception Description: Entity class [class org.abcd.MyClass1] has both an @EmbdeddedId (on attribute [fileId]) and an @Id (on attribute [id]. Both ID types cannot be specified on the same entity.
...
在 JPA / Eclipse Link 中似乎不允许将 @EmbeddedId 属性(@Embeddable 类的所有属性)和 @Id 属性一起定义为主键。
有人知道这个问题的可能解决方案吗?
任何帮助表示赞赏。
一些附加信息:
MyClassA 类应该包含有关某个存档文件的信息(进度,...;在上面的代码示例中省略);超类 SuperClass 的属性 fileId 用于标识该文件。目前fileId(id-class FileId)只包含文件名,以后会添加更多的属性。
MyClassB 包含有关存档中文件的信息。该文件将使用超类 SuperClass 的属性 id(它在存档中的相对路径)和 fileId 来标识。
我想到了以下数据库结构:
表“MyClass1”:
文件名 | 编号 | ...
表“MyClass2”:
文件名 | ...
我希望现在更清楚我到底想要什么:)。