2016-08-12 172 views
0

我有以下两类:休眠一一对一映射问题

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; 
    } 
} 

映射文件是::

//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> 

现在我跑的时候我的申请,我得到以下错误: :

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 

的错误来自setProteinData()在方法用户类。错误中的最后一条语句显示java.lang.NullPointerException并指向该方法。我不知道什么是错的。

感谢您的帮助

回答

0

我认为这个问题是,你不必在你的ProteinData类空(无参数)构造函数。尝试将它添加到类:从setProteinData方法proteinData_.setUser(this);

public ProteinData(){} 
0

删除呼叫。这不是必需的。如果没有其他构造函数(无论是否为arg或构造函数),编译器将创建默认构造函数,如果没有其他构造函数(或者不带参数或构造函数),则可以使用no-arg构造函数参数)出现在你的课堂上。

您可以在hibernate here中阅读关于无参数构造函数需求的更多讨论。

+0

'proteinData_.setUser(this);'可以没有任何问题,因为他想在'User'类中的实体之间设置关联 – Rocherlee