u010286723 2008-08-05 14:01
浏览 710
已采纳

hibernate 采用session.save(Object)方法保存不了数据

代码如下:
bean类:
package org.hibernate.sample.modle;
import java.io.Serializable;
import org.apache.commons.lang.builder.ToStringBuilder;

/** @author Hibernate CodeGenerator */
public class Student implements Serializable {
private static final long serialVersionUID = 1L;

/** identifier field */
private Integer studentId;

/** persistent field */
private String name;

/** persistent field */
private String sex;

/** persistent field */
private Integer age;

/** full constructor */
public Student(String name, String sex, Integer age) {
    this.name = name;
    this.sex = sex;
    this.age = age;
}

/** default constructor */
public Student() {
}

public Integer getStudentId() {
    return this.studentId;
}

public void setStudentId(Integer studentId) {
    this.studentId = studentId;
}

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

public String getSex() {
    return this.sex;
}

public void setSex(String sex) {
    this.sex = sex;
}

public Integer getAge() {
    return this.age;
}

public void setAge(Integer age) {
    this.age = age;
}

public String toString() {
    return new ToStringBuilder(this)
        .append("studentId", getStudentId())
        .toString();
}

}
映射配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<id name="studentId" type="java.lang.Integer" column="student_id" unsaved-value="0">
    <generator class="native"/>
</id>

<property name="name" type="java.lang.String" column="name" not-null="true"
    length="45"/>
<property name="sex" type="java.lang.String" column="sex" not-null="true"
    length="45"/>
<property name="age" type="java.lang.Integer" column="age" not-null="true"
    length="45"/>

<!-- Associations -->



配置文件:
<?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">

<!-- SessionFactory 配置 -->
<session-factory>
    <!-- MySQL配置 -->

    <!-- 数据库URL -->
    <property name="connection.url">
        <![CDATA[ jdbc:mysql://localhost:3306/bms?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8]]>
    </property>
    <!-- 数据库JDBC驱动 -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <!--数据库用户名 -->
    <property name="connection.username"><![CDATA[root]]></property>
    <!--数据库用户密码 -->
    <property name="connection.password"></property>
    <!--dialect ,每个数据库都有其对应的Dialet以匹配其平台特性 -->
    <property name="dialect"> org.hibernate.dialect.MySQLDialect</property>
    <!-- 是否将运行期生成的SQL输出到日志以供调试 -->
    <property name="show_sql">true</property>
    <!--映射文件配置,注意配置文件名必须包含其相对于根的全路径 -->
    <mapping resource="org/hibernate/sample/modle/Student.hbm.xml"/>
</session-factory>  


测试类:
package test;

import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;
import org.hibernate.sample.modle.Student;
import junit.framework.Assert;
import junit.framework.TestCase;

public class HibernateTest extends TestCase {
Session session = null;

/**
 * JUnit中setUp方法在TestCase初始化的时候会自动调用 一般用于初始化公用资源 此例中,用于初始化Hibernate Session
 */
protected void setUp() {
    try {
        /**
         * 采用hibernate.properties配置文件的初始化代码: Configuration config = new
         * Configuration(); config.addClass(TUser.class);
         */
        // 采用hibernate.cfg.xml配置文件
        // 请注意初始化Configuration时的差异:
        // 1.Configuration的初始化方式
        // 2.xml文件中已经定义了Mapping文件,因此无需再Hard Coding导入
        // POJO文件的定义
        Configuration config = new Configuration().configure();
        SessionFactory sessionFactory = config.buildSessionFactory();
        session = sessionFactory.openSession();
    } catch (HibernateException e) {
        e.printStackTrace();
    }
}

/**
 * 与setUp方法相对应,JUnit TestCase执行完毕时,会自动调用tearDown方法 一般用于资源释放
 * 此例中,用于关闭在setUp方法中打开的Hibernate Session
 */
protected void tearDown() {
    try {
        session.close();
    } catch (HibernateException e) {
        e.printStackTrace();
    }
}

/**
 * 对象持久化(Insert)测试方法
 * 
 * JUnit中,以”test”作为前缀的方法为测试方法,将被JUnit自动添加 到测试计划中运行
 */
public void testInsert() {
    try {
        Student student = new Student();

// student.setStudentId( Integer.valueOf(1));
student.setName("哈哈");
student.setSex("男");
student.setAge(Integer.valueOf(13));
session.save(student);
session.flush();
System.out.println(student.getStudentId());
} catch (HibernateException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}

/**
 * 对象读取(Select)测试 请保证运行之前数据库中已经存在name=’Erica’的记录
 */
public void testSelect() {
    String hql = " from Student where name='哈哈'";
    try {
        Query query= session.createQuery(hql);
        List list=query.list();
        Student student = (Student) list.get(0);
        Assert.assertEquals(student.getName(), "哈哈");
    } catch (HibernateException e) {
        e.printStackTrace();
        Assert.fail(e.getMessage());
    }
}

}

[b]问题补充:[/b]
数据库表的
create table student(
student_id integer unsigned auto_increment,
name varchar(45) not null,
sex varchar(45) not null,
age integer not null

);

  • 写回答

2条回答 默认 最新

  • iteye_14762 2008-08-05 14:23
    关注

    没有将你的save方法放在事务中!
    [code="java"]Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    session.save(...);
    tx.commit();
    session.close();[/code]
    另请参见robbin的精华贴:http://www.iteye.com/post/806

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮