6 Stimmen

Persistiere rohe Java-Enum mit Hibernate

Ich habe eine Entität, die eine Enum-Eigenschaft enthält. Diese Eigenschaft kann eine meiner Enum-Typen in meinem Code sein:

public enum AutomobileType {
   CAR, TRUCK, MOTORCYCLE
}

public enum BoatType {
   ROW_BOAT, YACHT, SHIP
}

@Entity
public class FooBar {

  @Enumerated(value=EnumType.ORDINAL)
  private Enum enumValue;

  public void setEnumValue(Enum value) { ... }
  public Enum getEnumValue() { ... }
}

Dies schlägt mit einer Ausnahme fehl: "Falscher Datentyp: Für Eingabestring: "[B@f0569a"". Ich habe FooBar geändert, um die Eigenschaft als Integer zu speichern, was funktioniert, aber das ist nicht das, was ich brauche. Ich brauche das tatsächliche Enum. Irgendwelche Vorschläge, wie man das so machen kann, dass das Enum als int persistiert werden kann, aber später in den richtigen Enum-Typ umgewandelt wird?

3voto

duffymo Punkte 298898

Sie müssen einen benutzerdefinierten UserType für das Enum definieren.

2voto

Bozho Punkte 570413

Allgemein sollten Sie das nicht tun. Wenn die beiden (oder mehr enums) demselben Feld zugewiesen werden können, dann führen Sie sie zu einem enum zusammen.

Wenn Sie Vererbung verwenden, wie z. B.: Fahrzeug mit zwei Unterklassen - Boot und Auto, dann können Sie in jeder Unterklasse ein anderes Feld haben - schließlich ist jedes dieser enums nur für den jeweiligen Typ relevant. Also:

@Column
private BoatType boatType;

0voto

Mike Q Punkte 22080

Ich denke nicht, dass dies einfach funktionieren kann, wenn mehrere Enum-Typen versuchen, in derselben Eigenschaft zu koexistieren. Wie weiß Hibernate, welche Enum-Klasse es instanziieren soll, wenn es das Feld aus der Datenbank lädt?

Wenn Sie das wirklich tun möchten, müssten Sie die Enum-Klasse + den Wert jedes Mal codieren, wenn Sie diese Eigenschaft persistieren (verwenden Sie einen benutzerdefinierten UserType, wie von duffymo vorgeschlagen).

Können Sie dies nicht in zwei Eigenschaften aufteilen, eine pro Enum-Klasse? Dann können Sie enumValue (und enumValue2) als die richtige Klasse deklarieren und es wird sofort funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X