解决hibernate只能插入一条数据的问题

hibernate初学,根据视频教程写好代码后,发现无论执行多少次main函数,数据库中只有一条数据,尝试多次,后来终于发现问题。。。

使用的工具是:MYSQL 5.7.13   eclipse 4.5.2  hibernate 4.0.5

第一步:

在mysql中新建一个数据库 名为DEMO01,然后再创建一个test表:

USE DEMO01;
CREATE TABLE test(
TEST_ID int auto_increment,
name varchar(20),
TEST_DATE date,
primary key(TEST_ID)
)engine=InnoDB default charset=utf8 auto_increment=1;

第二步:

新建一个Java project,添加持久化类

package com.hibernate.demo;
/*
 *持久化类test
 */
import java.util.Date;

public class test {
    private int id;
    private String name;
    private Date time;

    public test(){}

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getTime() {
        return time;
    }
    public void setTime(Date time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return "test [id=" + id + ", name=" + name + ", time=" + time + "]";
    }

}

第三步:

创建Hibernate的映射文件,其中property中的name对应持久化类中的属性,column中的name对应数据库中的字段名

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-13 17:46:08 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.hibernate.demo.test" table="TEST">
        <id name="id" type="int">
            <column name="TEST_ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="time" type="java.util.Date">
            <column name="TEST_DATE" />
        </property>
    </class>
</hibernate-mapping>

第四步:

创建Hibernate配置文件:

<?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>
    <property name="connection.username">root</property>
    <property name="connection.password">123456</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql:///demo01?useUnicode=true&amp;characterEncoding=UTF-8</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="hbm2ddl.auto">update</property>

  <mapping resource="com/hibernate/demo/test.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Hibernate配置文件内容都是以键值对的形式进行配置:

connection.driver_class指连接数据库的驱动,对不同的关系数据库,驱动不同,需要根据实际情况修改;

connection.url指对应的数据库的url;

dialect指对应的数据库方言;

show_sql指程序运行时是否在控制台输出SQL语句,true 输出,false 不输出。默认false,在调试程序时一般设为true,发布程序前改为false,因为输出SQL语句会影响程序的运行速度;

format_sql指程序运行时,是否在SQL语句中输出便于调试的注释信息。true 输出,false 不输出,默认false。该属性只有当show_sql为true时才有效。

hbm2dd.auto指对数据库的数据进行的操作类型:

create:每次加载hibernate,重新创建数据库表结构

create-drop:加载hibernate时创建,退出时删除表结构

update:加载hibernate自动更新数据库结构

validate:加载hibernate时,验证创建数据库表结构

嗯。。。。我的问题就出现在这里。。。一开始是写的create,后来改为update就没问题了。。。一旦发现数据库表丢失,首先看这里设置的值。。。

第五步:

创建会话工厂以及测试实例,增删查改都有,不过可能方案不全(按道理应该分开来写,我这里写一起了,偷了个懒~)

package com.hibernate.demo;

import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class testManage {
    private static final SessionFactory sessionFactory=buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        //创建配置对象
        Configuration cfg = new Configuration().configure();
        //创建服务注册对象
        StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
        StandardServiceRegistry sr = srb.build();
        //创建工厂会话对象
        return cfg.buildSessionFactory(sr);
    }

    public static void main(String[] args) {

        Session session=sessionFactory.openSession();
        session.beginTransaction();

        //新增
        test theTest=new test();
        theTest.setName("mist332!");
        theTest.setTime(new Date());
        session.save(theTest);

        //更新
        /*test uTest=new test();
        uTest.setId(1);//id不能少,Hibernate是根据ID来查询数据进行更新的
        uTest.setName("全宇宙我最帅啦~~~");
        session.update(uTest);*/

        //删除
        /*test dTest=new test();
        dTest.setId(1);//hibernate先进行查询,再删除
        test dTest1=(test)session.get(test.class, 1);
        session.delete(dTest1);
        */

        //查询

        //HQL查询,是Hibernate主推的查询方式,和SQL比较像,但是form后面是Java类名,不是数据库表名,
        //如果查询全字段 select * 可以省略不写
        /*Query query=session.createQuery("from test");
        List<test> list=query.list();
        for(test t:list){
            System.out.println(t.toString());
        }*/

        //当不是查询全字段,或者是从两张表中联合查询数据时,返回的是一个数组:
        /*Query query=session.createQuery(" select s.name,t.name from Student s ,test t  ");
        List<Object[]> list=query.list();//这里的每一行都是一个一维数组
        for(int i=0;i<list.size();i++){
            Object []o=(Object[]) list.get(i);//转型为数组
            String name1=(String) o[0];//与select中顺序的类型相对应,可以是类
            String name2=(String) o[1];
            System.out.println("Student中的name:"+name1+"test中的name:"+name2);
            System.out.println("查出来了~~~~~~~~");
        }*/

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();;
    }

}

如果我们把设置为create,那么执行的SQL就会是:

INFO: HHH000227: Running hbm2ddl schema export
Hibernate:
    drop table if exists TEST
Hibernate:
    create table TEST (
        TEST_ID integer not null,
        NAME varchar(255),
        TEST_DATE datetime,
        primary key (TEST_ID)
    )
八月 13, 2016 6:20:03 下午 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate:
    insert
    into
        TEST
        (NAME, TEST_DATE, TEST_ID)
    values
        (?, ?, ?)
八月 13, 2016 6:20:04 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql:///demo01?useUnicode=true&characterEncoding=UTF-8]
插入成功!

如果设置为update:

八月 13, 2016 6:44:24 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate:
    insert
    into
        TEST
        (NAME, TEST_DATE)
    values
        (?, ?)
八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler logWarning
WARN: SQL Warning Code: 1292, SQLState: 22007
八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler logWarning
WARN: Incorrect date value: ‘2016-08-13 18:44:24.789‘ for column ‘TEST_DATE‘ at row 1
八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql:///demo02?useUnicode=true&characterEncoding=UTF-8]
插入成功!

从打印的SQL语句中很容易就可以看出区别啦~

时间: 2024-10-11 07:00:46

解决hibernate只能插入一条数据的问题的相关文章

springmvc 使用poi解析excel并通过hibernate连续插入多条数据 实际数据库只能保存最后一条

有一个原始数据的excel表 用poi解析之后通过hibernate插数据库 结果 后来发现,有人说 果断尝试 问题解决 但是这好像并不是真正解决问题,只是解决了一个现象 因为有人说 https://blog.csdn.net/u010739551/article/details/49362403 实际上我刚才那种操作是正确的,并且做了测试,但是我实测是不行的,那只能解释为版本问题了 原文地址:https://www.cnblogs.com/jnhs/p/10060717.html

数据库中只能插入一条数据

问题原因 使用bean来创建全局的实体user,每次执行jpa的Save操作,user的id都相同,总是覆盖上一条记录. 问题解决 不适用@Autowired自动注入user,在新增用户的方法中创建临时user对象. Bug重现 原文地址:https://www.cnblogs.com/pycrab/p/10529283.html

SQL中一次插入多条数据

SQL中insert一次可以插入一条数据,我们有三种方法可以一次性插入多条数据. 1. 语法:select 字段列表 into 新表 from 源表 注意事项:此种方法新表是系统自动创建,语句执行前不可以存在新表,并且新表只能保留源表的标识列特性,其他约束不能保留. 若只需要源表的数据结构,我们可以在语句中添加(top 0) 2. 语法:insert into 目的表 select 字段列表 from 源表 注意事项:此种方法目的表必须在语句执行前存在,并且每一列要与源表对应. 在此处还有一些有

用一句mysql语句插入多条数据

假如有一个数据表A: id name title addtime 如果需要插入n条数据 : $time= time(); $data = array(    array(      'name'=>'name1','title'=>'title1','addtime'=>$time;    ),    array(      'name'=>'name2','title'=>'title2','addtime'=>$time;    ),    array(      

TOMCAT服务器每次只能接收9999条数据

在将原来32位TOMCAT版本更换到64位版本下出现服务器每次只能接收9999条数据. 经过追踪服务器日志获取如下信息: org.apache.tomcat.util.http.Parameters processParameters INFO: More than the maximum number of request parameters (GET plus POST) for a single request ([10,000]) were detected. Any paramete

SQL Server之 (三) 分组 类型转换函数 插入多条数据 字符串函数

SQL Server之 (三)  分组 类型转换函数  插入多条数据  字符串函数 自己学习笔记,转载请注明出处,谢谢!---酸菜 1.SQL 数据分组----Group by /Having  ①有一学生信息表:StuID/StuName/StuAge/StuGender/StuClassID; 求每个班级的ID和对应人数:select StuClassID 班级ID,count(*) 班级人数  from StuInfo group by StuClassID ; 求所有同学中男女同学对应人

jdbc:mysql和oracle插入一条数据返回主键

package org.sin.common.dao; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import or

使用JDBC向数据库中插入一条数据

原谅我是初学者,这个方法写的很烂,以后不会改进,谢谢 /** * 通过JDBC向数据库中插入一条数据 1.Statement 用于执行SQL语句的对象 1.1 通过Connection 的 * createStatement() 方法来获取 1.2 通过executeUpdate(sql) 的方法来执行SQL 1.3 * 传入的SQL可以是INSERT/UPDATE/DELETE,但不能是SELECT * * 2.Connection和Statement使用后一定要记得关闭 需要在finally

数据库一次性插入10w条数据,怎么插入效率快

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题 下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters). bulk方法主要思想是通过在客户端把数据都缓存在Table中,然后利用SqlBulkCopy一次性把Table中的数据插入到数据库 代码如下: public static void BulkToDB(DataTab