随笔-126  评论-247  文章-5  trackbacks-0

刚刚遇见一个很奇怪的问题,是因 Hibernate SQL 方言配置不正确引起的,之前还真不知道后果会这么严重,花了点时间才找出问题的所在。

这个异常不好排,因为后台没有抛出任何的异常信息,而且后台输出打印的信息很正常 !

实体类 :

 
package net.yeah.fancydeepin.po;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name 
= "person")
public class Person {

    
private Integer id;
    
private String  name;
    
    @Id
    @GenericGenerator(name 
= "idGenerator", strategy = "native")
    @GeneratedValue(generator 
= "idGenerator")
    
public Integer getId() {
        
return id;
    }
    
    @Column(length 
= 18)
    
public String getName() {
        
return name;
    }
    
    
public void setId(Integer id) {
        
this.id = id;
    }
    
    
public void setName(String name) {
        
this.name = name;
    }
    
}
 


hibernate.cfg.xml 清单 :

 1  
 2 <hibernate-configuration>
 3 
 4     <session-factory>
 5 
 6         <!-- Database connection settings -->
 7         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
 8         <property name="connection.url">jdbc:mysql://localhost:3306/temp</property>
 9         <property name="connection.username">username</property>
10         <property name="connection.password">password</property>
11         
12         <!-- SQL dialect -->
13         <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
14 
15         <!-- Enable Hibernate's automatic session context management -->
16         <property name="current_session_context_class">thread</property>
17         
18         <!-- Echo all executed SQL to stdout -->
19         <property name="show_sql">true</property>
20         <property name="format_sql">true</property>
21 
22         <mapping class="net.yeah.fancydeepin.po.Person"/>
23         
24     </session-factory>
25 
26 </hibernate-configuration>
27  


Junit 测试 :

 
@Test
    
public void createTable(){
        
        
new SchemaExport(new AnnotationConfiguration().configure()).create(truetrue);
    }
 

后台输出 :

 
    drop table 
if exists person

    create table person (
        id integer not 
null auto_increment,
        name varchar(
18),
        primary key (id)
    )
 

从后台输出的信息看来,没有任何的不妥,建表语句是正确的,但去数据库那里无论怎么个刷新法,就是没有 person 这张表,这个就很郁闷了 !

由于测试的时候,对于配置文件,一般都是采取 Copy 改的方式,这才引起的问题,回过头看 hibernate.cfg.xml 清单中的第 13 行,当注意到了

才知道自己犯了很低级的错误,第 13 配置的 Hibernate SQL 是 SQL  Server 的方言,而我现在用的是 MySQL 数据库,将这行配置改成 :

 
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
 

再次运行 Junit 测试,后台打印输出一模一样的信息,不同的是,这回数据库中的 person 表出来了,它是正确建的表。

最后附上 :

Hibernate SQL方言 (hibernate.dialect)

RDBMS Dialect
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i org.hibernate.dialect.Oracle9iDialect
Oracle 10g org.hibernate.dialect.Oracle10gDialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect




  
posted on 2012-10-06 14:29 fancydeepin 阅读(1838) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: