java - JPA - @EmbeddedId 和 @Id

标签 java database jpa eclipselink composite-primary-key

这是相关的 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 应包含有关某个存档文件的信息(进度,...;在上面的代码示例中省略);父类(super class)SuperClass的属性fileId用于标识该文件。目前fileId(id-class FileId)仅包含文件名,但稍后将添加更多属性。

MyClassB 包含有关存档中文件的信息。该文件将使用父类(super class) SuperClass 的属性 id(其在存档中的相对路径)和 fileId 进行标识。

我想到了以下数据库结构:

表“MyClass1”:

文件名 |编号 | ...

表“MyClass2”:

文件名 | ...

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

最佳答案

你的映射没有任何意义。您在同一个类中确实有一个 @EmbeddedId 和一个 @Id:您的 MyClassA 有一个 @Id 并且它扩展了一个已经有一个 @EmbeddedId 的父类(super class)。我不知道你为什么想要这个?您究竟想要实现什么目标?

关于java - JPA - @EmbeddedId 和 @Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270197/

相关文章:

database - Doctrine 通配符 WHERE 查询?

java - 绝地武士:破管

java - JPA where 子查询

Java 帮助 - ActionListener 不工作

java - Android:为 recyclerView 项目添加边框和舍入

java - Kotlin:如果条件为真,则将变量转换为不可空

java - 在 java 中如何将一个 JPanel 添加到另一个 JPanel

MySQL 插入脚本

java - 复合键映射 JPA+Hibernate

java - Spring 启动: How to add new Datasource at runtime