Mapim-Aufzählung
Wir haben bereits herausgefunden, wie man primitive Datentypen zuordnet: Wir verwenden die Annotation @Column und die Annotation @Type . Allerdings können nicht alle Fälle durch diese Anmerkungen abgedeckt werden. Und der häufigste Fall ist enum .
Java-Enum-Objekte können auf zwei Arten in der Datenbank gespeichert werden:
- als Zahl
- als String
Schreiben wir ein kleines Beispiel, in dem der Benutzer eine Lieblingsfarbe hat, die mithilfe von enum festgelegt wird.
enum Color {
RED,
ORANGE,
YELLOW,
GREEN,
BLUE,
VIOLET
}
Und fügen Sie der User- Klasse ein Farbfeld hinzu :
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Column(name="favorite_color")
public Color favoriteColor;
@Column(name="created_date")
public Date createdDate;
}
Wenn Hibernate den Farbtyp als Zahlen in der Basis speichern soll , benötigen wir das FeldLieblingsfarbeAnmerkung hinzufügen:
@Enumerated(EnumType.ORDINAL)
Wenn wir möchten, dass die Werte als Zeichenfolgen gespeichert werden , müssen wir eine Anmerkung hinzufügen:
@Enumerated(EnumType.STRING)
Beispiel:
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Enumerated(EnumType.ORDINAL) //value will be saved to the base as a number
@Column(name="favorite_color")
public Color favoriteColor;
@Column(name="created_date")
public Date createdDate;
}
Mapim Boolescher Wert
Das zweite nützliche Szenario ist die boolesche Typzuordnung. Es ist einfach so, dass SQL in der Vergangenheit keinen eigenen Datentyp für Boolean hat und stattdessen alles verwendet wird.
Die drei häufigsten Optionen sind:
- 1 oder 0
- „F“ oder „T“
- „Y“ oder „N“
Wenn Sie Ihre Basis entwerfen möchten, ist es im Allgemeinen besser, den BIT-Typ sofort zu schreiben. Nun, die vollständige Zuordnung dafür wird so aussehen:
@Column(name = "is_correct", columnDefinition = "BIT")
@Type(type = "org.hibernate.type.NumericBooleanType")
private Boolean isCorrect;
Wenn Sie die Datenbank nicht entwerfen, sehen Sie sich die Tabelle oben an und überlegen Sie, wie Sie die benötigten Typen richtig zuordnen.
Berechnete Felder
Manchmal stimmen die Anzahl der Felder in einer Entity-Klasse und die Anzahl der Spalten in einer Tabelle nicht überein. Dafür kann es mehrere Gründe geben.
Am häufigsten kommt es vor, dass es in unserer Entity-Klasse ein Feld gibt, das wir nicht in der Datenbank speichern möchten . Damit ist alles klar – fügen Sie einfach die Annotation @Transient zu einem solchen Feld hinzu und Hibernate ignoriert sie bei der Arbeit mit der Datenbank.
Beispiel:
@Entity(name = "Square")
public class Square {
@Id
public Long id;
public Integer width;
public Integer height;
@Transient
public Integer total;
}
Dies ist eine gute Option, aber beim Lesen eines Objekts aus der Datenbank ist das Gesamtfeld null. Und wir möchten, dass es das Produkt aus Breite*Höhe enthält. Dies ist auch im Ruhezustand möglich. Hierfür gibt es eine spezielle @Formula- Annotation .
@Entity(name = "Square")
public class Square {
@Id
public Long id;
public Integer width;
public Integer height;
@Formula(value = " width * height ")
public Integer total;
}
Ein solches Feld wird nicht in der Datenbank gespeichert, und wenn das Objekt aus der Datenbank gelesen wird, wird der durch die Formel berechnete Wert dorthin geschrieben.
Die SQL-Abfrage sieht etwa so aus:
SELECT id, width, height, (width* height) AS total FROM Square;
@Eingebettet
Eine weitere nützliche Anmerkung ist @Embedded . Es ermöglicht Ihnen, die Felder des untergeordneten Objekts als Felder der Entity-Klasse selbst zu betrachten.
Nehmen wir an, Sie haben eine Benutzerklasse und möchten ihr eine Adresse hinzufügen:
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Column(name="user_address_country")
public String country;
@Column(name="user_address_city")
public String city;
@Column(name="user_address_street")
public String street;
@Column(name="user_address_home")
public String home;
@Column(name="created_date")
public Date createdDate;
}
Alles scheint in Ordnung zu sein, aber aus Java-Sicht wäre es logisch, die Adresse in eine separate Klasse zu legen. Die Adresse ist immer noch eine separate Einheit. Aber wie geht das, wenn alle diese Informationen in der Datenbank in der Benutzertabelle gespeichert sind?
Die @Embedded- Annotation wird uns dabei helfen . Zuerst erstellen wir die UserAddress- Klasse und fügen darin alle Informationen zur Adresse des Benutzers ein:
@Embeddable
class UserAddress
{
@Column(name="user_address_country")
public String country;
@Column(name="user_address_city")
public String city;
@Column(name="user_address_street")
public String street;
@Column(name="user_address_home")
public String home;
}
Und dann verwenden wir ein Feld dieser Klasse in unserer Benutzerklasse :
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Embedded
public UserAddress address;
@Column(name="created_date")
public Date createdDate;
}
Dank der @Embedded- Annotation versteht Hibernate zum Zeitpunkt des Speicherns des Objekts, dass die Felder der UserAddress- Klasse als Felder der User- Klasse selbst behandelt werden müssen .
Wichtig! Wenn Sie sich entscheiden, Ihrer User- Klasse zwei UserAddress- Felder hinzuzufügen , funktioniert die Verwendung von @Embedded nicht mehr: Sie haben doppelte Felder und müssen diese irgendwie trennen. Dies geschieht durch Überschreiben von Annotationen: mithilfe der Annotation @AttributeOverrides .
Ich möchte, dass Sie das wissen, aber wir werden hier nicht ins Detail gehen. Ich denke, das ist genug, um dir den Kopf zu zerbrechen. Für Neugierige kann ich einen Link zur offiziellen Dokumentation hinterlassen .
GO TO FULL VERSION