it-swarm.com.de

Boxed vs primitiver Typ als Entitäts-ID

In JPA (Hibernate-Implementierung) Welcher Typ ist besser als Entitäts-ID zu verwenden: Boxed-Typ (z. B. Integer) oder Unboxed-Typ (z. B. int)?

Ein Freund sagte, Sie sollten Boxed-Typen verwenden, da Hibernate beim Erstellen einer neuen Entität in Ihrem Programm erkennt, dass die ID null lautet, und versteht, dass eine neue Zeile in der Datenbank erstellt werden sollte (im Gegensatz dazu, wenn id nicht null lautet, aktualisiert Hibernate möglicherweise eine bestehende Zeile in der Datenbank).

Aber die ID meiner Entitäten war int und es funktionierte ohne Fehler und wir wissen, dass der Standardwert von primitiven Instanzvariablen 0 ist. Also sagte er, dass der Ruhezustand 0 vielleicht als etwas Besonderes behandelt und dass das Objekt ein neues ist.

20
Mahozad

Nun, wir verwenden Nicht-Primitive und haben einen starken Grund dafür. Viele unserer Felder, die entweder int/Integer haben zum Beispiel einen absoluten Geschäftswert von zero, um vollkommen gültig zu sein. Denken Sie zum Beispiel an ein Schuldenfeld - es ist mehr als OK, wenn das Feld zero lautet, was bedeutet, dass Sie keine Schulden haben.

Das Problem ist, dass bei Primitiven Null ein Standardwert ist - so dass Sie möglicherweise versehentlich vergessen, ihn beispielsweise über ein setDebt festzulegen, sodass möglicherweise Ihre Datenbank mit einem Wert erreicht, den Sie nie erreichen dort hingehen soll. Aus diesem Grund verwenden wir Integer mit einigen Überprüfungen, die beispielsweise niemals null sein sollten. Aber selbst wenn wir vergessen, korrekte Validierungen hinzuzufügen, wird dieser Code möglicherweise break mit einem NullPointerException (vorzugsweise in Tests) und ich mag eine Ausnahme mehr als inkonsistente Werte in der Datenbank.

7
Eugene

Scheint Current Documentationempfiehlt die Verwendung von Boxed Type.

Es wird empfohlen, dass Sie konsistent benannte Bezeichnerattribute für persistente Klassen deklarieren und einen nullfähigen (d. H. Nicht primitiven) Typ verwenden.

9
gtgaxiola

Es gibt keinen Unterschied zwischen dem primitiven Element (z. B. int) und seinem Wrapper (z. B. Integer) für die Entitäts-ID. Beide sind gemäß JPA-Spezifikation gültig. JPA-Anbieter ist intelligent genug, um den Status und den Lebenszyklus einer Entität zu verfolgen. Wenn die Entitäts-ID 0 (primitiver Typ) oder NULL (Wrapper-Typ) ist, generiert der JPA-Anbieter eine ID für die Entität, wenn der ID-Generator konfiguriert ist. Null wird nicht als gültige Entitäts-ID betrachtet, wenn ID automatisch generiert wird.

Beide Fälle mit Cmobilecom JPA getestet, und es funktioniert genauso gut. Natürlich ist kein Leistungsunterschied festzustellen.

Haftungsausschluss: Ich bin Entwickler von Cmobilecom JPA , einer leichtgewichtigen JPA-Implementierung für Java und Android.

2
John

Eindeutige Bezeichner von Entitäten und Sammlungen können jeden Basistyp haben, mit Ausnahme von Binary, Blob und Clob. (Composite-Bezeichner sind auch zulässig, siehe unten.)

Die Basiswerttypen verfügen über entsprechende Typkonstanten, die in org.hibernate.Hibernate definiert sind. Beispielsweise repräsentiert Hibernate.STRING den Zeichenfolgentyp.

0
Angad Bansode

Ich bevorzuge Boxed Type im Entity-Modell, weil dadurch die Verwendung von Boxed Type in Generics .. Flexibilität gegeben ist. Zum Beispiel kann das Entitätsmodell hier nur den Typ haben, der bis zu Serializable für ID reicht. Dies wird später in der Service-Schicht nützlich sein, in der verschiedene Vorgänge für den Primärschlüssel ausgeführt werden können.

public interface BaseEntity<E extends Serializable> extends Serializable {
  E getId();
}

Das Entity-Modell könnte folgendermaßen aussehen:

@Entity
public class PhoneNumber implements BaseEntity<Long> {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "PHONE_NUMBER_ID")
  private Long id;
0
pradipforever