java - 使用@IdClass 休眠一个实体的@ManyToOne
问题描述
我刚刚在我的项目中添加了一个新实体,现在它没有启动。我认为这与@ManyToOne
成为复合键的一部分有关,但我不确定。我将问题减少到以下实体:
一类:
@Table(name = "A")
@Entity
@IdClass(KeyA.class)
public class A {
@Id
private String aId;
@Id
@ManyToOne
private B b;
public String getaId() {
return aId;
}
public void setaId(String aId) {
this.aId = aId;
}
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
}
B.类:
@Table(name = "B")
@Entity
@IdClass(KeyB.class)
public class B {
@Id
String bId;
@Id
String bId2;
public String getbId() {
return bId;
}
public void setbId(String bId) {
this.bId = bId;
}
public String getbId2() {
return bId2;
}
public void setbId2(String bId2) {
this.bId2 = bId2;
}
}
KeyA.类:
public class KeyA implements Serializable {
private String aId;
private String b;
}
KeyB.class
public class KeyB implements Serializable{
public String bId;
public String bId2;
}
抛出异常:
Error creating bean with name 'entityManagerFactory' defined in class path resource
[...]
Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.component.PojoComponentTuplizer]
[...]
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_201]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_201]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_201]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_201]
at org.hibernate.tuple.component.ComponentTuplizerFactory.constructTuplizer(ComponentTuplizerFactory.java:104) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
... 43 common frames omitted
Caused by: org.hibernate.PropertyNotFoundException: Could not locate field name [bId] on class [java.lang.String]
at org.hibernate.internal.util.ReflectHelper.findField(ReflectHelper.java:371) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
at org.hibernate.property.access.internal.PropertyAccessFieldImpl.<init>(PropertyAccessFieldImpl.java:34) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
at org.hibernate.property.access.internal.PropertyAccessStrategyFieldImpl.buildPropertyAccess(PropertyAccessStrategyFieldImpl.java:26) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
at org.hibernate.mapping.Property.getGetter(Property.java:311) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
at org.hibernate.tuple.component.PojoComponentTuplizer.buildGetter(PojoComponentTuplizer.java:141) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
我尝试了一切,包括导入最新的 javassist。我在 Java 1.8 上运行 Spring Boot 2.2.5.RELEASE(它也发生在 11 中)
解决方案
您的复合键A
public class KeyA implements Serializable {
private String aId;
private String b;
}
结构好像B
只有一个字符串 ID(这里称为b
),而实际上它本身有一个复合键
public class KeyB implements Serializable{
public String bId;
public String bId2;
}
所以你必须改变KeyA
以正确地表示这种关系:
public class KeyA implements Serializable {
private String aId;
private KeyB keyB;
}
推荐阅读
- java - Mapstruct:加入id
- c# - Xamarin - Prism:如何将 ContentPage 的整个 ViewModel 传递给子 ContentView
- neural-network - 关于 Keras 和批地面实况。
- kubernetes - 如何在监视模式下将 jq 过滤器应用于 kubectl 输出?
- python-3.x - 改变移动方向时水平翻转图像
- sql - 使用 SQL Server 2008 使用 WMIC 命令获取物理和网络驱动程序号
- eval - 如何使用 .$$eval 函数
- php - 在 PHP 5.3 上准备 SELECT 类型的错误请求
- python - 每 X 秒运行一次代码
- php - 无法更新我的记录