解決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語句中很容易就可以看出區別啦~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM