休眠@OneToOne收到NullPointer异常

时间:2018-09-30 19:51:50

标签: hibernate-annotations

我正在回顾自己的Java技能,您对社区的支持非常棒,您的技巧对我有很大帮助。

我陷入了Hibernate @OneToOne配置中,这是一个非常简单的设计和代码,但是我找不到错误。非常感谢您的帮助。

这是user.java代码,user_id由MySQL的自动增量列生成。为了简单起见,我省略了hash()和equals()代码。 Hibernate可以理解User类,但是缺少关系另一端的Address类。

任何帮助将不胜感激。 谢谢

1)这是user.java:

package myPackage;

import java.io.Serializable;
import java.util.Arrays;

import javax.persistence.*;

@Entity
@Table(name="user1")

public class User implements Serializable {

    private static final long serialVersionUID = 3271213543123246487L;

    @Id
    @GeneratedValue
    @Column(name="user_id")
    private Integer user_id;

    @Column(name="user_name", length=100, nullable=false)
    private String user_name;


    @OneToOne (cascade= CascadeType.ALL)
    @PrimaryKeyJoinColumn(name="user_id")
    private Address myAddress;

    public Integer getUser_id() {
        return user_id;
    }

    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public Address getMyAddress() {
        return myAddress;
    }

    public void setMyAddress(Address myAddress) {
        this.myAddress = myAddress;
    }   
}

2)这是Address.java代码:

package myPackage;

import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.annotations.Parameter;

@Entity
@Table(name="address1")

public class Address implements Serializable {

    private static final long serialVersionUID = 3605176021936036836L;

    @Id
    @GeneratedValue(generator="address_ibfk_2")
    @org.hibernate.annotations.GenericGenerator(name="address_ibfk_2", 
        strategy="foreign",parameters =@Parameter(name="property",value="user1"))
    @Column(name="user_id")
    private Integer user_id; 

    @Column(name="address_line1", length=100, nullable=false)
    private String address_line1;

    public String getAddress_line1() {
        return address_line1;
    }

    public void setAddress_line1(String address_line1) {
        this.address_line1 = address_line1;
    }   
}

3)这是非常简单的TestUser类

public class TestUser {

    public static void main(String[] args) {

    Session mySession = HibernateUtil.getSessionFactory().openSession();
    System.out.println("Connection status"+mySession.isConnected());
    System.out.println("Session status"+mySession.isOpen());

    Transaction myTransaction = mySession.beginTransaction();           

    try {

        User myUser = new User();
        Address myAddress = new Address();

        myUser.setUser_name("TesteO2O");
        myAddress.setAddress_line1("Rua A");
        myUser.setMyAddress(myAddress);

        mySession.save(myUser);

        myTransaction.commit();
        System.out.println("myUser saved sucessfully");

    } catch (Exception e) {
        e.printStackTrace();
        myTransaction.rollback();
    } finally {
        mySession.close();
    }
}                   

}

4)这是hibernate.cfg.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>

        <!--MySQL Config-->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/p2pl_dev?serverTimezone=UTC</property>
        <property name="connection.username">xyz</property>
        <property name="connection.password">blabla</property>
        <property name="current_session_context_class">thread</property>

        <!--Connection Pool Config: max_statements cached, idle time in seconds-->
        <property name="c3po.min_size">2</property>
        <property name="c3po.max_size">3</property>
        <property name="c3po.timeout">300</property>
        <property name="c3po.max_stamentes">50</property>
        <property name="c3po.idle_test_period">3000</property>

        <!--Debug Config, show_sql=console, format_sql=legible -->
        <property name="show_sql">true</property>           
        <property name="format_sql">true</property>         
        <property name="generate_statistics">true</property>        
        <property name="use_sql_comments">true</property>       

        <!-- Classes -->
        <mapping class="myPackage.User"/>
        <mapping class="myPackage.Address"/>

   </session-factory>
</hibernate-configuration>

5)最后是错误跟踪

Hibernate: 
    /* insert myPackage.User
        */ insert 
        into
            user1
            (user_name) 
        values
            (?)
java.lang.NullPointerException
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValue(AbstractEntityTuplizer.java:650)
    at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:4736)
    at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:96)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:684)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:676)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:235)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118)
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:460)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:294)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)
    at myPackage.TestUser.main(TestUser.java:26)

0 个答案:

没有答案