2010-08-01 11 views
36

Ecco il mio JPA2 definizione/Hibernate:Hibernate JPA, MySQL e TinyInt (1) per il booleano invece di bit o char

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

In MySql questa colonna è risolto per un po '(1) tipo di dati - che fa non funziona per me Per i problemi legacy ho bisogno di mappare il booleano a un minuscolo non un po '. Ma non vedo la possibilità di modificare il tipo di dati predefinito. C'è qualche?

risposta

31

Provare il NumericBooleanType. Per qualche motivo questo non ha un nome breve tipo dichiarato in modo che avrebbe dovuto usare:

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

Questo fa mappa per un tipo integer ma probabilmente funzionerà bene con un TINYINT.

UPDATE: org.hibernate.type.NumericBooleanTypenon funziona con TINYINT in alcuni RDBMS. Cambia il tipo di colonna del database in INTEGER. Oppure utilizzare un valore Java @Type diverso o columnDefinition, a seconda dei casi.

In questo esempio, la risposta di Dude di @Column(nullable = false, columnDefinition = "TINYINT(1)") funzionerebbe senza alcuna modifica al database.

+0

Funziona correttamente, ma dopo aver modificato il bit (1) in int – zaletniy

+0

-1, ma solo perché la risposta @Dude è migliore. – Johan

+0

Funziona anche con un obiettivo booleano? – Rafael

48

@L'annotazione del testo è un'annotazione Hibernate.

A pieno JPA2 (con Hibernate 3.6+), il modo per mappare un campo booleano in TINYINT (1) tipo SQL invece di BIT (1), è quello di utilizzare l'attributo ColumnDefinition.

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

nb: l'attributo lunghezza sembra non avere alcun effetto in questo caso, quindi usiamo la sintassi (1).


Con Hibernate 4.0+, questo tipo di sintassi può causare un errore di runtime in questo modo:

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

Sembra che in questo caso, il vostro unico modo è quello di utilizzare tinyInt1isBit = false nella stringa di connessione origine dati di MySQL come questo:

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

Tra l'altro, è ora possibile utilizzare t ha attributo di lunghezza simile a questo:

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

grazie mille fratello! –

+3

Poiché MySQL alias 'BOOLEAN' in' TINYINT (1) 'si può anche usare' columnDefinition = "BOOLEAN" ', che potrebbe essere un po 'più leggibile. – eggyal

+0

hai ragione, puoi anche usare l'alias BOOLEAN con MySQL a patto che l'alias sia impostato su TINYINT, il che è vero per ora. A proposito, BOOLEAN e TINYINT non sono entrambi tipi di dati SQL standard, quindi si corre il rischio di un errore se si modifica il proprio dialetto del fornitore di dati (ad es. Oracle). – Donatello

1

ho avuto questo errore:

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

E questo ha funzionato per me:

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

sto usando JPA con Spring dati/Hibernate 5.0 su un database MySQL.

Nel mio oggetto entità, ho messo il seguente:

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

Il mio ambiente dev ha hibernate auto-ddl impostato per l'aggiornamento, in modo che quando ho schierato a dev, ha creato la tabella con column_name di tipo tinyint (1).

Il mio codice che utilizza questa colonna considera nullo come falso, quindi non sono preoccupato dei valori nulli, se lo siete, potreste renderlo un booleano primitivo o aggiungere ", nullable = false" all'annotazione della colonna.

Questa soluzione è completamente JPA (non utilizza l'annotazione Tipo ibernazione) e non richiede modifiche alla stringa di connessione.

Problemi correlati