2010-08-01 19 views
36

ait Boolean için hazırda JPA, MySQL ve TINYINT (1) my JPA2/Hazırda tanımı şöyledir: bu sütun biraz (1) veri türüne çözülene MySQLyerine bit ya İşte kömürün

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

- bağlantıda bulunduğu benim için çalışmıyor. Eski sorunlar için, booleanı biraz küçümsemek zorundayım. Ancak, varsayılan veri türünü değiştirme olasılığını göremiyorum. Var mı

cevap

31

NumericBooleanType'u deneyin. Kullanmak olurdu böylece Nedense bu ilan kısa tip adı yok:

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

Bu does bir INTEGER tipine haritası ama muhtemelen bir TINYINT ile iyi çalışır.

GÜNCELLEME: org.hibernate.type.NumericBooleanType Bazı RDBMS'de TINYINT ile çalışmamaktadır. Veritabanı sütun türünü INTEGER olarak değiştirin. Ya da uygun şekilde farklı bir Java @Type değeri veya columnDefinition kullanın.

Bu örnekte, Dude'nin @Column(nullable = false, columnDefinition = "TINYINT(1)") cevabı hiçbir veritabanı değişikliği olmadan çalışacaktır.

+0

İyi çalışıyor, ancak bit'i (1) int – zaletniy

+0

-1'e dönüştürdükten sonra, sadece @Dude yanıtı daha iyi olduğu için. – Johan

+0

Bu, bir Boole objetiyle de çalışır mı? – Rafael

48

@Type ek açıklaması, Hazırda Bekletme ek açıklamadır.

tam JPA2 olarak, TINYINT yerine BIT (1) (1) SQL türü bir Boole alanı eşleştirmek için yol ( hazırda 3.6+ ile), columnDefinition özelliğini kullanmaktır. Nb: length özniteliğinin bu durumda hiçbir etkisinin olmadığı görünüyor, sonra (1) sözdizimini kullanırız. = False

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

durumda, tek yol kullanmak tinyInt1isBit gibi görünüyor:


hazırda 4.0+ ile sözdizimi bu tür böyle bir çalışma zamanı hatası neden olabilir böyle MySQL veri kaynağı bağlantı dizesine:

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

arada, artık t kullanabilirsiniz Böyle o uzunluk özellik:

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

çok teşekkür ederim kardeşim! –

+3

MySQL diğer adı "BOOLEAN" olan "TINYINT" (1) 'e,' '' columnDefinition = "BOOLEAN" 'ı kullanabilir, bu biraz daha okunabilir olabilir. – eggyal

+0

haklısınız, diğer ad zaten TINYINT için ayarlanmış olduğu sürece, BOOLE ADIMI ile MySQL kullanabilirsiniz. Bu arada, BOOLEAN ve TINYINT her ikisi de standart SQL veri türleri değildir, bu nedenle veri sağlayıcınızın lehçesini değiştirirseniz (örn: Oracle) hata riskiyle karşı karşıya kalırsınız. – Donatello

1

bu hatayı vardı:

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)]

Ve bu benim için çalıştı: Ben JPA kullanıyorum

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

Bahar Veri/Hazırda 5.0 ile ilgili bir MySQL veritabanı. Benim varlık nesnede

, şu koyun: Ben dev dağıtırken

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

Benim dev ortamı güncellemek için otomatik ddl seti hazırda bekletme vardır, bu yüzden, bu tip tinyint ait column_name ile tablo oluşturdu (1).

Bu sütunu kullanan kodum null değerini false olarak kabul eder, bu nedenle boş değerlerden endişe duymuyorum, öyleyse ilkel bir boole yapabilir veya Sütun ek açıklamalarına ", nullable = false" ekleyebilirsiniz.

Bu çözüm tam olarak JPA (hazırda bekleme Türü ek açıklamalarını kullanmaz) ve bağlantı dizesinde değişiklik yapılmasını gerektirmez.