解决hibernate只能插入一条数据的问题-程序员宅基地

技术标签: java  

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语句中很容易就可以看出区别啦~

转载于:https://www.cnblogs.com/miaoying/p/5768735.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30666943/article/details/99648740

智能推荐

基于神经网络的变压器故障分类诊断_基于bp神经网络的变压器故障诊断-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏58次。引言本文基于BP神经网络对变压器的故障进行分类和诊断。变压器根据五种特征气体对应四种故障类型(高能放电、低能放电、过热和正常)。对已知类型的训练样本进行计算,构造BP神经网络,然后对测试样本进行分类。该方法的正确率可达88%。变压器是电力系统中分布广泛、造价昂贵、结构复杂的电气设备,担负着电能传送和电压转换的重任,其正常运行直接影响了整个电力系统的安全性和稳定性。对油浸式变压器来说,随着运行的持续,油与中间的固体有机材料会逐渐老化和分解,由于不同的故障类型,产生的气体含量和比例也不同,所以可利用对油中气_基于bp神经网络的变压器故障诊断

Oracle快速入门(多表查询大全)-程序员宅基地

文章浏览阅读752次,点赞23次,收藏25次。在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)如何准备面试?1、前期铺垫(技术沉积)程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

全国计算机考试满分是多少,中考计算机多少分满分?中考计算机考试分数是多少...-程序员宅基地

文章浏览阅读2.3k次。详细一点 谢谢一、加分条件和资格认定 (一)在《2008年北京市高级中等学校招生工作中文艺、科技、体育特长生推荐项目》(见附件1)中获奖的考生和获得市级三好学生称号的考生,在录取时语文、数学、英语三科试卷卷面分数均为150分,其他学科卷面分数均为100分。语... 九年级转学到我市的,以及在外地就学(含往届)回我市参加中考的中考总分是600分 语文150,数学150,英语150,物理,100,化学..._中考计算机多少分

【图像加密解密】基于混沌序列实现图像加密和解密(图像相关性分析)附Matlab实现_混沌序列解密-程序员宅基地

文章浏览阅读75次。基于混沌序列实现图像加密和解密是一种常见的图像加密技术。它通过利用混沌序列的高度性和敏感性,对图像进行扰动以达到加密的目的。以下是基于混沌序列实现图像加密和解密的基本步骤:混沌序列生成:使用混沌系统(如Logistic映射、Lorenz系统)生成一个混沌序列。这个混沌序列将作为密钥用于加密和解密过程。图像扩频加密:将原始图像中的每个像素值与混沌序列进行异或或其他非线性操作。这样可以在图像中引入高频噪声,使其具有良好的扩频特性。密文传输:将扩频加密后的图像传输给接收方。_混沌序列解密

python是编译语言吗_python程序不需要编译吗-程序员宅基地

文章浏览阅读338次。python编译过程和执行原理(1)python执行原理这里的解释执行是相对于编译执行而言的。我们都知道,使用C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制的可执行文件。运行该程序的时候,就可以把二进制程序从硬盘载入到内存中并运行。但是对于Python而言,python源码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行..._python问件写好了会不会编译

k-prototypes聚类算法-程序员宅基地

文章浏览阅读1.3w次,点赞7次,收藏87次。引言数据变量为单一的数值型和单一的类别型的聚类算法之前都已经介绍过了,但是实际的数据大多数是数值型和类别型变量混合。针对混合型变量的数据,采用k-prototypes算法进行聚类。k-prototypes算法k-prototypes算法在聚类的过程中,是将数据的数值型变量和类别型变量拆开,分开计算样本间变量的距离,再将两者相加,视为样本间的距离。k-prototypes聚类的准则就是使用一..._k-prototypes

随便推点

vim常用操作命令-程序员宅基地

文章浏览阅读864次,点赞8次,收藏20次。本文介绍了vim的常用操作命令,方便大家一起查阅

Objective C++实现回调函数_objective c++ 回调函数-程序员宅基地

文章浏览阅读4.4k次。下面为大家介绍一下在Objective C++中怎么样去实现回调,大家都知道Object C 与 C++ 混编的时候,是不能用Cocoa 自带的委托机制来实现回调的。比如在做一些多平台的项目时,由于接口是c++编写的,这个时候你要怎么样去将接口函数里的数据传递到你Object C编写的对象中去呢。最简单的方法就是使用ios消息机制-Notification,来传递从接口中收到的数据。但如果这个时候_objective c++ 回调函数

tip动画_tip组件动画效果样式-程序员宅基地

文章浏览阅读371次。下拉刷新通过UIControl来设置拥有三种状态:显示下拉刷新状态,显示松手就刷新状态,显示正在刷新状态每种状态显示的内容都不一样,内容可通过自身设置的UILabel来显示刷新时可令自己父控件的偏移量下移一部分一段时间,自身在此期间显示需要显示的内容显示的内容通过可通过所在父类的偏移量来判断所在父类可通过willMoveToSuperview来获得通过KVO监听父控_tip组件动画效果样式

基于java的陶瓷工厂进销存管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+部署视频)_景德镇陶瓷管理系统设计与实现-程序员宅基地

文章浏览阅读1.9k次,点赞5次,收藏12次。2.1.1Eclipse简介Eclipse这个工具是我开始接触编程就一直使用的工具,它本身也是开源的,在在校学习和日常的实习工作中,使用最为广泛。Eclipse这个工具可扩展性是非常好的,工作中可以通过安装不同的插件来引入各种的实用的功能,让开发与测试变得更加紧密,也更加的方便。最值得一提的是,Eclipse工具本身还附带了Java语言的JDK工具(JDK)这是一个标准的插件的集合。Eclipse的主要项目包括三个组成的部分,分别是Eclipse项目、_景德镇陶瓷管理系统设计与实现

浅谈自然语言处理(NLP)学习路线(一)--- 概述_自然语言处理学习路线-程序员宅基地

文章浏览阅读5.9k次,点赞46次,收藏184次。好了,告一段落,对NLP基础学习路线做个总结:1. 数学基础:重点是函数性质、导数(特别是对矩阵求偏导)、不同概率的定义和性质、数学期望、参数估计、梯度下降法2. 机器学习:重点是LR、Xgboost、HMM、CRF3. 传统文本算法: n-gram、tf-idf、textrank、lda4. 经典神经网络语言模型:LSTM、NNLM、word2vector、fasttext5. 进阶神经网络语言模型:elmo、transformer、gpt、bert。_自然语言处理学习路线

VS Code+Sumatra PDF正反向搜索_sumatrapdf反向搜索-程序员宅基地

文章浏览阅读1.3k次,点赞10次,收藏13次。重新装机后,在配置VS Code和LaTeX的环境后,问题卡在了正反向搜索这边,简单记录下。VS Code + Tex Live + SumatraPDF配置LaTeX反向搜索(持续更新)解决SumatraPDF 在VS Code上反向搜索失效Sumatra PDF反向搜索的问题记录 (texlive+vscode)_sumatrapdf反向搜索

推荐文章

热门文章

相关标签