这是相关的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链接中不允许将@EmbeddedId属性(@Embeddable类的所有属性)和@Id属性一起定义为主键。
有人知道这个问题的可能解决方案吗?
任何帮助表示赞赏。
一些其他信息:
MyClassA类应包含有关某个存档文件的信息(progress,...;在上面的代码示例中省略了该信息);超类SuperClass的属性fileId用于标识此文件。当前,fileId(id-class FileId类)仅由文件名组成,但是稍后将添加更多属性。
MyClassB包含有关存档中文件的信息。该文件将使用超类SuperClass的属性ID(其在存档中的相对路径)和fileId进行标识。
我想到以下数据库结构:
表“ MyClass1”:
fileName | id | ...
表“ MyClass2”:
fileName | ...
我希望现在可以更清楚地知道我到底想要什么:)。
最佳答案
您的映射没有任何意义。您确实在同一个类中有一个@EmbeddedId
和@Id
:您的MyClassA
有一个@Id
,它扩展了已经具有@EmbeddedId
的超类。我不知道你为什么要那样?您到底想完成什么?