这是相关的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包含有关存档中文件的信息。该文件将使用atttribute id(它是归档中的相对路径)和超类SuperClass的fileId来标识。
我想到了以下数据库结构:
表“MyClass1”:
fileName | id | ...
表“MyClass2”:
fileName | ...
我希望现在能更明确一点我想要的东西:)。
答案 0 :(得分:1)
你的映射没有任何意义。您在同一个班级中有一个@EmbeddedId
和一个@Id
:您的MyClassA
有一个na @Id
,它会扩展一个已经有@EmbeddedId
的SuperClass。我不知道你为什么会这么想?你到底想要完成什么?
答案 1 :(得分:0)
正如大家推荐的那样 - 也许更改数据模型会让你更有意义。
这是我的简单建议:
包含ID字段和get / set-tters的基本类实体 喜欢:
@MappedSuperclass
public class Entity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
// getters/setters
}
这可以用于模型中所有实体的基本类。 然后,按照您的功能要求,下一步可以帮助您:
@Entity
@Inheritance(strategy = InheritanceType.JOIN)
public class File extends Entity {
@Column(unique=true)
private String fileName;
// other future columns you mention above
}
@Entity
public class ArchiveFile extends File {
// other information here - progress and so on
}
@Entity
public class ArchiveFileTracker extends Entity {
@OneToMany
private ArchiteFile architeFile;
// other specific information here
}
我希望这可以满足您的要求。
祝你好运, 西蒙