Hibernate session.get()显示为null

时间:2015-06-12 10:56:18

标签: java hibernate null

虽然我在stackoverflow上读取了session.get null问题并尝试按照他们的建议进行操作,但我的问题似乎还在继续。

SessionFactory mysessionfactory = new Configuration().configure().buildSessionFactory();
Session mysession = mysessionfactory.openSession();
mysession.beginTransaction();

Myperson person3 = (Myperson) mysession.get(Myperson.class, 3);
System.out.println("there you go : "+person3.getName());

看起来很简单,我只是想从数据库中检索数据。让我告诉你数据库。

如您所见,我想要检索的数据有一个名字!

这就是我得到的,没有! 最后,我运行调试模式的代码,我希望你能理解这个问题,并建议一个解决方案。

enter image description here

我在这里发生冲突,我的数据库显示UserId为3的数据有一个名字,但为什么我不能在输出中看到它?

编辑:这是我要求的hibernate xml文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

 <hibernate-configuration>
    <session-factory>

      <property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
      </property>

      <property name="hibernate.connection.driver_class">
        com.mysql.jdbc.Driver
      </property>

      <property name="connection.pool.size">1</property>

      <property name="hibernate.connection.url">
        jdbc:mysql://localhost:3306/myhibernatedb
      </property>

      <property name="hibernate.connection.username">
       root
      </property>

      <property name="hibernate.connection.password">
       000003
      </property>

      <property    name="hibernate.current_session_context_class">thread</property>

      <property name="show_sql">true</property>

      <property name="hbm2ddl.auto">update</property>

      <!-- List of XML mapping files -->

      <mapping class="org.emreverim.com.Myperson"/>
      <mapping class="org.emreverim.com.Vehicle" />
      <mapping class="org.emreverim.com.FourWheeler" />
      <mapping class="org.emreverim.com.TwoWheeler" />

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

编辑2:这是您要求的myperson类。

@Entity
public class Myperson {

    @Id @GeneratedValue(strategy=GenerationType.AUTO)   
    private int userID;     
    private String name;    


    @OneToMany(cascade=CascadeType.PERSIST)
    private Collection<Vehicle> vehicle = new ArrayList<Vehicle>();


    public Collection<Vehicle> getVehicle() {
        return vehicle;
    }
    public void setVehicle(Collection<Vehicle> vehicle) {
        this.vehicle = vehicle;
    }

    @Lob
    private String description;
    @Temporal (TemporalType.DATE)
    private Date joinedDate;


    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Date getJoinedDate() {
        return joinedDate;
    }
    public void setJoinedDate(Date joinedDate) {
        this.joinedDate = joinedDate;
    }
    public int getUserID() {
        return userID;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void setUserID(int userID){

        this.userID = userID;
    }

}

3 个答案:

答案 0 :(得分:1)

在您的实体地图中,您忘记将@column属性注释添加到字段中,而@table将其链接到表格。

示例:

@Column(name="description")
private String description;

选中此示例以获取注释http://archive.oreilly.com/pub/a/onjava/2007/02/08/an-introduction-to-hibernate-3-annotations.html?page=2

答案 1 :(得分:1)

我认为这里的问题是因为Hibernate Session.get() method 需要一个Seriliazable id对象,而在你的情况下没有提供这里mysession.get(Myperson.class, 3)

因为这里的给定值3是原始类型int,它只包含值而且没有序列化,所以你必须使用 new Integer()方法为了传递Integer可序列化对象或 new Long()Long可序列化对象传递给get()方法,只需更改:

Myperson person3 = (Myperson) mysession.get(Myperson.class, 3);

要:

Myperson person3 = (Myperson) mysession.get(Myperson.class, new Integer(3));

或者:

Myperson person3 = (Myperson) mysession.get(Myperson.class, new Long(3));

答案 2 :(得分:1)

我们碰巧看到了解决方案,我的数据库已经配置为utf-16,而它应该是utf-8。所以它就像那样简单。感谢你所有的担忧,我为所有的答案付出了沉重的代价。