类似于@ManyToOne Referencing a composite key in JPA. 这是使用Hibernate 5.6的旧版本Spring Boot.

我有三个实体类:

@Entity class A { Long getId(); ... }
@Entity class B { Long getId(); ... }

@Entity
@IdClass(ABPK.class)
@Data
class AB {
  @Id
  @Column(name="a_id", insertable=false, updatable=false)
  private Long aId;
  @Id
  @Column(name="b_id", insertable=false, updatable=false)
  private Long bId;
  @ManyToOne
  @JoinColumn(name="a_id")
  private A a;
  @ManyToOne
  @JoinColumn(name="b_id")
  private B b;
  public AB() { }
  public AB(A a, B b) {
    this.a = a;
    this.aId = a.getId();
    this.b = b;
    this.bId = b.getId();
  }
}

@Data
class ABPK implements Serializable {
  Long aId;
  Long bId;
}

当我try 创建和保存它时

var a = new A("a");
var b = new B("b");
var ab = new AB(a,b);
abDao.saveAndFlush(ab);

我得到了最奇怪的错误

原因:java.xsl.SQLExcycle:参数索引超出范围

它生成的插入声明在日志(log)中是正确的

Hibernate: insert into ab (a_id, b_id) values (?, ?)

我运行了调试器,当我只期待两个时,它似乎添加了第三个"字段"来映射,第一个似乎是AB类型,然后是A,然后是B.

推荐答案

我用Hibernate 5.6.15重现了这个问题--尽管确切的版本应该并不重要,但我认为这是规范中一个复杂的领域,而且其细节通常被误解.无论如何,关系领域的@MapsId为我解决了问题.即:

@Entity
@IdClass(ABPK.class)
@Data
class AB {
  @Id
  @Column(name="a_id", insertable=false, updatable=false)
  private Long aId;

  @Id
  @Column(name="b_id", insertable=false, updatable=false)
  private Long bId;

  @MapsId("aId")             // <--- HERE
  @ManyToOne
  @JoinColumn(name="a_id")
  private A a;

  @MapsId("bId")             // <--- AND HERE
  @ManyToOne
  @JoinColumn(name="b_id")
  private B b;

  public AB() { }

  public AB(A a, B b) {
    this.a = a;
    this.aId = a.getId();
    this.b = b;
    this.bId = b.getId();
  }
}

Java相关问答推荐

在正确位置绘制多边形的PFA问题

内容处置 destruct 了PSP请求

无法在Java中将hhmmss格式的时间解析为LocalTime

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

取消按钮,但没有任何操作方法引发和异常

弹簧靴和龙目岛

在for—each循环中的AnimationTimer中的if语句'

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

Spark忽略Iceberg Nessie目录

Com.example.service.QuestionService中的构造函数的参数0需要找不到的类型为';com.example.Dao.QuestionDao;的Bean

如何使用值中包含与号的查询参数创建一个java.net.URI

Java中将文本拆分为数字或十进制数字和字符串

如何只修改父类ChroniclerView位置0处的第一个嵌套ChroniclerView(child)元素?

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

为什么Collectors.toList()不能保证易变性

如何以编程方式保存workBench.xmi?

Cucumber java-maven-示例表-未定义一步