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
- tôi chạy chương trình của tôi và cho phép Hibernate để tạo bảng
- này sau đó tôi thay đổi giá trị của
hibernate.hbm2ddl.auto
đến xác thực 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.1
và Hibernate 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.
liên quan: http: // stackoverflow. com/questions/289727 –
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. –
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? ** –