[英]Hibernate One-To-One mapping issues
I have the following two classes: 我有以下两节课:
public class User {
private int id;
private String name;
private ProteinData proteinData;
public User(){
setProteinData(new ProteinData());
}
public ProteinData getProteinData() {
return proteinData;
}
public void setProteinData(ProteinData proteinData_) {
this.proteinData = proteinData_;
proteinData_.setUser(this);
}
// additional getters and setters
}
public class ProteinData {
private int id;
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Mapping files are: 映射文件为:
//User
<hibernate-mapping>
<class name="com.simpleprogrammer.User" table="USERS">
<meta attribute="class-description">
This class contains the User detail.
</meta>
<id name="id" type="int">
<column name="ID" />
<generator class="identity"/>
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<one-to-one name="proteinData" class="com.simpleprogrammer.ProteinData" cascade="save-update"/>
</hibernate-mapping>
// proteinData
<hibernate-mapping>
<class name="com.simpleprogrammer.ProteinData" table="PROTEINDATA">
<id name="id" type="int">
<column name="ID" />
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" class="com.simpleprogrammer.User" constrained="true">
</one-to-one>
<property name="total" type="int" column="TOTAL" />
<property name="goal" type="int">
<column name="GOAL"/>
</property>
</class>
</hibernate-mapping>
Now I when run my application, I get the following errors: 现在,当我运行我的应用程序时,出现以下错误:
Exception in thread "main" org.hibernate.PropertyAccessException: Exception occurred inside setter of com.simpleprogrammer.User.proteinData
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:88)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:710)
at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:371)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4509)
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:186)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:137)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1108)
at org.hibernate.loader.Loader.processResultSet(Loader.java:964)
at org.hibernate.loader.Loader.doQuery(Loader.java:911)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:312)
at org.hibernate.loader.Loader.loadEntity(Loader.java:2121)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3927)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:460)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:429)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:206)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:145)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1092)
at org.hibernate.internal.SessionImpl.immediateLoad(SessionImpl.java:1007)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:173)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at com.simpleprogrammer.User_$$_javassist_0.getName(User_$$_javassist_0.java)
at com.pluralsight.Introduction_To_Hibernate_Pluralsight.Program.main(Program.java:45)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65)
... 25 more
Caused by: java.lang.NullPointerException
at com.simpleprogrammer.User.setProteinData(User.java:44)
... 30 more
The error comes from setProteinData()
method in the User
class. 该错误来自
User
类中的setProteinData()
方法。 The last statement in the error displays java.lang.NullPointerException
and points to that method. 错误中的最后一条语句显示
java.lang.NullPointerException
并指向该方法。 I don't know what I am doing wrong. 我不知道我在做什么错。
I think the issue is that you don't have an empty (no-argument) constructor in your ProteinData class. 我认为问题在于,ProteinData类中没有空(无参数)构造函数。 Try to add it to the class:
尝试将其添加到类中:
public ProteinData(){}
Remove call of proteinData_.setUser(this);
删除对
proteinData_.setUser(this);
调用proteinData_.setUser(this);
from setProteinData
method. 从
setProteinData
方法。 It is not required. 不需要。
Moreover, you can use no-arg constructor public ProteinData(){}
or even if you don't use no-arg constructor, it is fine, Compiler will create default constructor if there is no other constructors( either no-arg or constructors with arguments) present in your class. 此外,您可以使用无参数构造函数
public ProteinData(){}
或者即使您不使用无参数构造函数,也可以,如果没有其他构造函数(无参数或构造函数),编译器将创建默认构造函数带有参数)。
You can read more discussion about no-arg constructor requirement in hibernate here . 你可以阅读有关休眠无参数的构造需要更多的讨论在这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.