2013-02-15 10 views
8

Angesichts dieser Klasse zugeordnet mit JPA (mit JPA 1.0 und Hibernate):Primitiver Typ im JPA-Mapping. Was ist, wenn die Datenbankspalte NULL sein kann?

@Entity 
public class Foo { 

    private int bar; 

    /* ... */ 
} 
  1. Was passiert, wenn ich versuchen, einen Datensatz zu laden, die die BAR Spalte auf NULL gesetzt?
  2. Kann ich angeben, wie das Feld bar festgelegt wird, wenn die entsprechende Spalte NULL ist?

Hinweise

Ich weiß, dass diese Praxis nicht am besten ist. Die Frage ist, mehr aus Neugier und es ist durch diese Situation inspiriert:

  • Die Datenbanktabelle ist eine Zwischenspeichertabelle: Hinzufügen einer NOT NULL Einschränkung unpraktisch ist. Falsche Daten werden erwartet, und der Punkt meines Codes besteht darin, Daten zu validieren, aufzuräumen und/oder abzulehnen, bevor sie in die "echte" Datenbank geladen werden.
  • Ich habe für einige Felder akzeptable Standardwerte. Zum Beispiel ein boolean Flag, das standardmäßig auf false gesetzt werden sollte.
+3

Wenn die db-Spalte null enthalten kann, sollten Sie eine Wrapper-Klasse verwenden, um den Wert darzustellen. – Perception

Antwort

2
  1. Exception

2.

@Column(name = “bar”, nullable = false, columnDefinition = “bigint(20) default 0″) 
private int bar; 

es löst Ihr Problem.

+0

Aber mit Punkt 2 muss ich die Datenbank-Spaltendefinition ändern, nicht wahr? –

+0

Ich stimme zu, dass wenn Sie wirklich eine Null-Darstellung wollen, sollten Sie nur den Balken auf Integer ändern. Wenn Sie jedoch Null vermeiden möchten, können Sie einen Standardwert festlegen. – Matheus

+0

Übrigens denke ich, dass primitive Typen bereits einen Standardwert haben. Wenn Sie jedoch bereits eine Spalte mit Nulleinträgen haben, ist der Änderungsbalken in Integer die Lösung. – Matheus

11

Ich würde lieber Objekte verwenden, wenn eine Spalte Nullwert enthalten könnte, weil Matheus 'Idee falsche Daten einführt. NULL <> 0!

+0

können Sie bitte erklären, was Sie mit falschen Daten hier meinen. Matheus setzt den Standardwert auf 0 und nullable = false, also würde es niemals null sein. Was meinst du mit schlechten/falschen Daten? – Ankit

+2

'columnDefinition' wird * nur * für die DDL-Generierung verwendet (d. H. Zum Erstellen von Anweisungen zum Erstellen und Ändern von Tabellen), sodass der Standardwert der Standardwert des Grundelements ist. In der Tat sollten Sie keine Spalten mit Standardwerten erstellen, wenn Sie JPA verwenden. Wenn Ihr Feld ein Grundelement ist, wird standardmäßig der Grundtyp des Grundtyps verwendet. Wenn Ihr Feld ein Objekt ist, legt die Datenbank den Standardwert fest, der in Ihrer Tabelle definiert ist. Das Gegenstück der Spalte im eingefügten Entitätsobjekt wird jedoch nicht so aktualisiert, dass es den Standardwert widerspiegelt. –

Verwandte Themen