2010-06-01 10 views
5

Ich habe eine Klasse mit einem booleschen Attribut. Wenn ich diese Klasse instanziiere und behalte, wird das boolesche Attribut mit dem Wert "false" anstatt mit dem erwarteten "null" gespeichert. Wie kann ich ein boolesches Attribut auf "Null" setzen?Wie füge ich den Nullwert in ein boolesches Attribut ein, wenn Hibernate verwendet wird?

+2

Morte Rolo Können Sie Ihre Klasse und ihre Zuordnung zeigen ??? –

+0

@Arthur Ronald F D Garcia: Es ist nur eine reguläre @Entity Klasse mit einem @Column Boolean Attribut. –

+0

Ihre Datenbank muss dies tun. Welche Datenbank und welchen Spaltentyp verwenden Sie? –

Antwort

3

Dies ist ein seltsames Problem. Ein Boolean Attribut mit einem null Wert sollte definitiv als NULL gespeichert werden und der tinyint Spalte-Typ erlaubt das. Ich kann das Problem nicht selbst untersuchen, aber hier ist was ich tun würde:

Zuerst würde ich die Protokollierung von Hibernate DML-Anweisungen und JBDC-Parameter aktivieren, um zu bestätigen, dass Hibernate tatsächlich NULL (und es sollte) übergeben. Die relevanten Kategorien (Kapitel 3.5. Logging) sind org.hibernate.SQL und org.hibernate.type.

Wenn der erste Test das Problem nicht aufdeckt, würde ich versuchen, es weiter zu isolieren mit einer einfachen Testklasse mit rohen JDBC, um einen mit einem null Wert einzufügen (und lesen Sie es auch). Wenn dieser Test nicht positiv ist, würde ich den JDBC-Treiber vermuten.

Welchen JDBC-Treiber (und Version) verwenden Sie übrigens? Versuchen Sie mit der neusten Version von jTDS (und umgekehrt), wenn Sie den Microsoft-Treiber verwenden.

4

Stellen Sie zunächst sicher, dass Sie einObjekt und nicht einen boolean Typ definieren. Wenn Sie Hibernate mit JPA-Attributen verwenden, können Sie @Column(nullable=true) hinzufügen, um Hibernate explizit mitzuteilen, dass die Spalte standardmäßig NULL haben soll.

+3

Nullable Attribut ist standardmäßig True –

+0

Dies funktioniert nicht ... –

+1

Was ist das Schema Ihrer Tabelle? Erlaubt es NULL-Werte in dieser Spalte? Darüber hinaus können Sie versuchen, den Code zu debuggen, in dem Sie eine neue Instanz erstellen. Möglicherweise wird der Wert in Ihrem Code auf "false" gesetzt. – Marc

2

Zuerst stellen Sie sicher, dass das Objekt, das Sie beibehalten möchten, Boolean nicht primitiv boolean ist. Zweitens können Sie die entsprechende Spalte als char (1) definieren, die 'Y', 'N' oder Nullwert enthalten kann. und schließlich, und das wichtigste die folgende Zeile Sie hibernate.cfg.xml: -

<property name="query.substitutions">'Y'=true,'N'=false</property> 

wenn u hibernate.properties verwenden dann folgende Datei: -

hibernate.query.substitutions true 'Y', false 'N' 

dies würde helfen Sie out, um Nullwerte in booleschen Typ Spalte zu speichern. Vergessen Sie nicht, die Eigenschaft als type = "boolean" in der Zuordnungsdatei zuzuordnen.

Verwandte Themen