1

这是相关的 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”:

文件名 | ...

我希望现在更清楚我到底想要什么:)。

4

2 回答 2

1

你的映射没有任何意义。你在同一个类中有一个@EmbeddedId和一个:你有 na并且它扩展了一个已经有一个. 我不知道你为什么想要那个?你到底想完成什么?@IdMyClassA@Id@EmbeddedId

于 2013-01-11T01:26:10.570 回答
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 
}

我希望这可以满足您的要求。

祝你好运,西蒙

于 2013-01-11T18:44:18.683 回答