这是相关的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的超类。我不知道你为什么要那样?您到底想完成什么?

10-08 19:18