2012-11-29 29 views
5

Tôi nhận được Hibernate ngoại lệ:Strange Hibernate ngoại lệ với cột kiểu

sai loại cột. Tìm thấy: bit, mong đợi: BOOLEAN DEFAULT TRUE

Tôi có lớp User:

package mypackage; 

import javax.persistence.*; 
import java.util.ArrayList; 
import java.util.List; 

@Entity 
@Table(name = "USER") 
public class User { 

    @Id 
    @GeneratedValue 
    @Column(name = "ID", unique = true, nullable = false) 
    private Long id; 

    @Column(name = "STATUS", columnDefinition = "BOOLEAN DEFAULT TRUE", 
           nullable = false) 
    private Boolean status = Boolean.TRUE; 

    // getters and setters 
} 

này hoạt động đúng nếu Hibernate tạo bảng chính nó trong cơ sở dữ liệu. Khi

<property name="hibernate.hbm2ddl.auto">create</property> 

hoặc

<property name="hibernate.hbm2ddl.auto">create-drop</property> 

Nhưng nếu

  1. tôi chạy chương trình của tôi và cho phép Hibernate để tạo bảng
  2. này sau đó tôi thay đổi giá trị của hibernate.hbm2ddl.auto đến xác thực
  3. và tôi chạy chương trình của tôi một lần nữa với bảng đã được tạo ra bởi Hibernate và với

    <property name="hibernate.hbm2ddl.auto">validate</property> 
    

vì vậy tôi có được ngoại lệ:

org.hibernate.HibernateException: Cột Wrong gõ vào dbtest.user cho cột STATUS. Tìm thấy: bit, mong đợi: BOOLEAN DEFAULT TRUE

Bất cứ ý tưởng gì có thể là lý do cho hành vi này của Hibernate và làm thế nào tôi có thể sửa chữa nó?

Tôi sử dụng MySQL server 5.1Hibernate 4.0.1.

lớp Run của tôi chỉ là hai dòng:

public class Run { 

    public static void main(String[] main) { 

    SessionFactory sessionFactory = 
       new AnnotationConfiguration().configure().buildSessionFactory(); 

    Session session = sessionFactory.getCurrentSession(); 
    } 
} 

Cấu trúc của bảng:

CREATE TABLE USER (
    ID BIGINT(20) NOT NULL AUTO_INCREMENT, 
    STATUS TINYINT(1) NOT NULL DEFAULT 1, 
    PRIMARY KEY (ID), 
    UNIQUE INDEX ID (ID) 
) 
COLLATE='utf8_general_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 
AUTO_INCREMENT=2 

My hibernate.cfg:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="connection.url">jdbc:mysql://127.0.0.1:3306/dbtest</property> 
    <property name="connection.username">root</property> 
    <property name="connection.password">root</property> 

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="current_session_context_class">thread</property> 
    <property name="connection.pool_size">5</property> 
    <property name="hibernate.transaction.flush_before_completion">true</property> 
    <property name="hibernate.transaction.auto_close_session">true</property> 
    <property name="hibernate.hbm2ddl.auto">validate</property> 
    <property name="hibernate.show_sql">false</property> 
    <property name="hibernate.format_sql">true</property> 
    <property name="hibernate.use_sql_comments">false</property> 
    <property name="hibernate.connection.charSet">true</property> 

    <mapping class="mypackage.User"/> 
    </session-factory> 
</hibernate-configuration> 

Hibernate tạo bảng với kiểu TINYINT và Tôi không xen vào dữ liệu cơ sở và không thực hiện bất kỳ thay đổi nào trong bảng theo cách thủ công! Tôi chỉ thay đổi hibernate.hbm2ddl.auto thành validate và không có gì khác.

+1

liên quan: http: // stackoverflow. com/questions/289727 –

+0

Tôi không ** giá trị mặc định ** trong bảng nếu tôi chọn 'BIT DEFAULT 1' thay vì' BOOLEAN DEFAULT TRUE' trong chú thích. Tôi nhận được 'STATUS BIT (1) NOT NULL' trong db. –

+1

Vì vậy, câu hỏi của tôi có thể được lặp lại như sau: ** Làm thế nào để khai báo chính xác một giá trị mặc định cho một trường boolean bằng cách sử dụng chú thích Hibernate? ** –

Trả lời

0
private Boolean status = Boolean.TRUE; 

Nên dẫn đến giá trị mặc định là true.

Một cách khác để giải quyết vấn đề này là sử dụng:

@PrePersist 
public void prePersist() 
{ 
    if (status == null) 
    { 
     status = Boolean.TRUE; 
    } 
} 
0

chú thích hoang dã đoán kể từ khi tôi đã không sử dụng thành lập bản đồ, nhưng ở đây đi:

Đó ColumnDefinition trông giống như nói một cách rõ ràng hibernate để sử dụng loại cột boolean với giá trị mặc định đúng, nhưng MySql không có loại boolean, vì vậy có thể

columnDefinition = "BOOLEAN DEFAULT TRUE" 

phải giống như thế này

columnDefinition = "tinyint DEFAULT 1" 
2

Như những người khác đã nói: Không có kiểu boolean-column nào trong MySql. Tôi đã có một vấn đề tương tự và "tạo ra" một phương ngữ riêng. Nó mở rộng MySQL5Dialect mặc định và đăng ký steanard sql-type BOOLEAN vào bit kiểu cột MySql.

public class Mysql5BitBooleanDialect extends MySQL5Dialect{  
    public Mysql5BitBooleanDialect() { 
     super(); 
     registerColumnType(java.sql.Types.BOOLEAN, "bit");   
    }  
} 

Sau đó bạn có thể sử dụng nó bằng cách thiết lập các phương ngữ trong tính ngủ đông của bạn: hibernate.dialect = your.package.Mysql5BitBooleanDialect

Hope this helps ..