2010-08-01 62 views
36

Đây là JPA2/Hibernate định nghĩa của tôi:Hibernate JPA, MySQL và tinyint (1) cho Boolean thay vì bit hoặc char

Code: 
@Column(nullable = false) 
private boolean enabled; 

Trong MySql cột này đã được giải quyết để một chút (1) datatype - mà không không làm việc cho tôi. Đối với các vấn đề kế thừa, tôi cần ánh xạ boolean tới một chút xíu không chút nào. Nhưng tôi không thấy khả năng thay đổi kiểu dữ liệu mặc định. Có cái gì không?

Trả lời

31

Hãy thử NumericBooleanType. Vì một số lý do, điều này không có tên loại ngắn được khai báo, do đó bạn phải sử dụng:

@Column(nullable = false) 
@Type(type = "org.hibernate.type.NumericBooleanType") 
private boolean enabled; 

Điều này sẽ ánh xạ thành loại INTEGER nhưng có thể sẽ hoạt động tốt với TINYINT.

CẬP NHẬT: org.hibernate.type.NumericBooleanTypekhông hoạt động với TINYINT trong một số RDBMS. Chuyển loại cột cơ sở dữ liệu thành INTEGER. Hoặc sử dụng một giá trị Java @Type khác hoặc cộtDefinition, nếu thích hợp.

Trong ví dụ này, câu trả lời của Dude là @Column(nullable = false, columnDefinition = "TINYINT(1)") sẽ hoạt động mà không có bất kỳ thay đổi nào về cơ sở dữ liệu.

+0

Hoạt động tốt, nhưng sau khi thay đổi bit (1) thành int – zaletniy

+0

-1, nhưng chỉ vì câu trả lời @Dude tốt hơn. – Johan

+0

Điều này cũng có tác dụng với một máy chải kỹ Boolean không? – Rafael

48

@Lưu chú loại là chú thích Hibernate.

Đầy đủ JPA2 (với Hibernate 3.6+), cách ánh xạ trường Boolean thành loại TINYINT (1) SQL thay vì BIT (1), là sử dụng thuộc tính columnDefinition.

@Column(nullable = false, columnDefinition = "TINYINT(1)") 
private boolean enabled; 

nb: thuộc tính độ dài dường như không có hiệu lực trong trường hợp này, khi đó chúng tôi sử dụng cú pháp (1).


Với Hibernate 4.0 +, loại cú pháp có thể gây ra một lỗi thời gian chạy như thế này:

Wrong column type Found: bit, expected: TINYINT(1) 

Dường như trong trường hợp này, cách duy nhất của bạn là sử dụng tinyInt1isBit = false trong chuỗi kết nối nguồn dữ liệu MySQL như sau:

jdbc:mysql://server_host:3306/database?tinyInt1isBit=false 

Bằng cách này, bạn có thể sử dụng t ông chiều dài thuộc tính như thế này:

@Column(nullable = false, columnDefinition = "TINYINT", length = 1) 
private boolean enabled; 
+0

cảm ơn bạn rất nhiều bro! –

+3

Vì MySQL bí danh 'BOOLEAN' thành' TINYINT (1) 'cũng có thể sử dụng' columnDefinition = "BOOLEAN" ', có thể dễ đọc hơn một chút. – eggyal

+0

bạn nói đúng, bạn cũng có thể sử dụng bí danh BOOLEAN với MySQL miễn là bí danh được đặt thành TINYINT, điều này là đúng cho bây giờ. Nhân tiện, BOOLEAN và TINYINT đều không phải là các kiểu dữ liệu SQL chuẩn, vì vậy bạn có nguy cơ thất bại nếu bạn thay đổi phương ngữ của nhà cung cấp dữ liệu (ví dụ: Oracle). – Donatello

1

Tôi có lỗi này:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/context-config.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: org.hibernate.type.NumericBooleanType, at table: bookingItem, for columns: [org.hibernate.mapping.Column(enabled)]

Và điều này đã làm việc cho tôi:

@Column(nullable = false, columnDefinition = "TINYINT(1)") 
private boolean enabled; 
1

Tôi đang sử dụng JPA với mùa xuân Dữ liệu/Hibernate 5.0 trên một cơ sở dữ liệu MySQL.

Trong đối tượng Entity của tôi, tôi đặt như sau:

@Column(name = "column_name", columnDefinition = "BOOLEAN") 
private Boolean variableName; 

môi trường dev của tôi có ngủ đông tự động DDL thiết lập để cập nhật, vì vậy khi tôi triển khai tới dev, nó tạo ra bảng với column_name loại tinyint (1).

Mã của tôi sử dụng cột này coi là không đúng, vì vậy tôi không lo lắng về null, nếu bạn có, bạn có thể biến nó thành boolean nguyên thủy hoặc thêm ", nullable = false" vào chú thích Cột.

Giải pháp này hoàn toàn JPA (không sử dụng chú thích kiểu ngủ đông) và không yêu cầu thay đổi chuỗi kết nối.

Các vấn đề liên quan