开发者社区> 问答> 正文

求解:Hibernate 持久化操作 不能同步到数据库 ?:报错

(1)hibernate.cfg.xml

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

           
<hibernate-configuration>

 <session-factory>
  <property name="connection.username">root</property>
  <property name="connection.url">
   jdbc:mysql://localhost:3306/test
  </property>
  <property name="dialect">
   org.hibernate.dialect.MySQLDialect
  </property>  
  <property name="connection.password">111</property>
  <property name="connection.driver_class">
   com.mysql.jdbc.Driver
  </property>
  <property name="show_sql">true</property>
  <mapping resource="test/Person.hbm.xml" />

 </session-factory>

</hibernate-configuration>

(2)Person.java

package test;

public class Person implements java.io.Serializable {

 private int personID;
 private String firstName;
 private String lastName;
 private int age;
 public int getPersonID() {
  return personID;
 }
 public void setPersonID(int personID) {
  this.personID = personID;
 }
 public String getFirstName() {
  return firstName;
 }
 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }
 public String getLastName() {
  return lastName;
 }
 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }

}

(3)Person.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="test.Person" table="person" catalog="test">
        <id name="personID" type="java.lang.Integer">
            <column name="personID" />
            <generator class="identity" />
        </id>
        <property name="firstName" type="java.lang.String">
            <column name="FirstName" length="15" />
        </property>
        <property name="lastName" type="java.lang.String">
            <column name="LastName" length="15" />
        </property>
        <property name="age" type="java.lang.Integer">
            <column name="Age" />
        </property>
    </class>
</hibernate-mapping>
(4)测试hibernate持久化操作

package test;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test {

 public static void main(String[] args)
 {
  Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
  SessionFactory sf = cfg.buildSessionFactory();
         
      Person p = new Person();  
      p.setFirstName("test");
      p.setLastName("001");
      p.setAge(111);
  Session session =sf.openSession();
        Transaction tx = null;
  try
  {
    tx = session.beginTransaction(); 
    session.save(p);
    p.setAge(42);
    p.setFirstName("testfirst");
    p.setLastName("testlast");

      List persons = session.createQuery("from Person").list();
      System.out.println(persons.size());     
      for(int i=0;i<persons.size();i++)
      {
      Person p1 = (Person)persons.get(i);
      System.out.println(p1.getPersonID()+"\t"+p1.getFirstName()+"\t"+p1.getLastName()+"\t"+p1.getAge()+"\t\n");    
      }    
    
  }catch(Exception e)
  {
   tx.commit();
   
  }
   session.close();
 }
 
}
!!!!!!!!!---(1)不明白的是执行了session.save(p)这句代码后,为什么数据没有同步到数据库????????????

!!!!!!!!!----(2)当运行整个java文件时,控制台读取到了数据库中的所有数据,而session.save(p)中的对象p数据库中不存在,但还是读取出来了

eg:

Hibernate: insert into test.person (FirstName, LastName, Age) values (?, ?, ?)
Hibernate: update test.person set FirstName=?, LastName=?, Age=? where personID=?
Hibernate: select person0_.personID as personID0_, person0_.FirstName as FirstName0_, person0_.LastName as LastName0_, person0_.Age as Age0_ from test.person person0_
4
1 yang shide 112 

2 sdfsdf fsdf 4555 

3 dfg dfg 545 

21 testfirst testlast 42 

!!!!!!!-----(3)为什么我每次运行这个测试类,想要save的这个对象的id都一直在递增---------------------?????????


希望大哥们,帮我解释一下,感觉很奇怪的,这问题想不明白..

猜想可能把这数据存到内存里去了 ,只作为一个瞬时对象..不过貌似不可能吧??

展开
收起
kun坤 2020-06-06 16:42:49 517 0
1 条回答
写回答
取消 提交回答
  • 居然在异常处理里  tx.commit(); ??

    这行代码应该放在 try 段的最后,异常处理里应该是 tx.rollback();

    ######

    lll

    ######

    异常里能commit什么到数据库,自增的空行。

    ######

    呃,介个问题。

    hibernate 中事务操作。

    建议楼主还是看看hibernate对象的三种状态吧。官方文档就有。

    ######

    引用来自#2楼“红薯”的帖子

    居然在异常处理里  tx.commit(); ??

    这行代码应该放在 try 段的最后,异常处理里应该是 tx.rollback();

     嘿嘿 谢谢大哥提示 原来事务的处理弄错了 不懂事务的目的呀 欠缺理解

    ######

    引用来自#5楼“jeffsui”的帖子

    呃,介个问题。

    hibernate 中事务操作。

    建议楼主还是看看hibernate对象的三种状态吧。官方文档就有。

     谢谢大哥提醒 我对三种状态倒是理解了 就是对事务缺乏理解

    2020-06-06 16:42:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载