1. So konfigurieren Sie die Viele-zu-Viele-Beziehung
有三张表 role、permission,分别是角色与权限表,二者是多对多关系,对应关系的中间表为p_role_permission,中间表中r_sysId对应role表中的主键sysId、中间表中p_sysId列对应permission表中的主键sysId(说白了就是中间表中两列是外键列分别指向role和permission表)。下面代码是role表对应的注解配置实体类
@Entity
@Table(name="role",catalog="byky")
pubic class Role{
......
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="p_role_permission",joinColumns= {@JoinColumn(name="r_sysId",referencedColumnName = "sysId")},inverseJoinColumns={@JoinColumn(name="p_sysId",referencedColumnName = "sysId")})
public Set<Permission> getPermissions() {
return permissions;
}
......
}
- Der Abrufwert in der Annotation @ManyToMany kann mit zwei Optionen konfiguriert werden: fetch = FetchType.LAZY bedeutet verzögertes Laden mithilfe der Proxy-Technologie. Wenn das Rollenobjekt geladen wird, wird das Berechtigungsattribut des Rollenobjekts nicht vorübergehend geladen, wenn das getPermissions () der Rolle wird aufgerufen, der Ruhezustand übernimmt dies. Fragen Sie die Datenbank ab, um die Daten zu laden. Ein Punkt muss besonders hervorgehoben werden. Beim verzögerten Laden muss die Sitzung im Ruhezustand geöffnet sein. Die dem aktuellen Rollenobjekt zugeordnete Sitzung wird geschlossen. Beim Aufrufen der Berechtigungseigenschaft des Rollenobjekts tritt ein Fehler com.sun.jdi.InvocationException auf gemeldet werden. Achten Sie daher darauf, den Attributwert für das verzögerte Laden nach dem Schließen der Sitzung nicht abzurufen. Es ist üblich, ihn in Contreller aufzurufen, es sei denn, Sie verwenden deklarative Elemente, um das Schließen der Methode getCurrentSession zu verzögern.
- @ManyToMany-Annotation in der Abrufwertkonfiguration fetch = FetchType.EAGER bedeutet, dass beim sofortigen Laden die Daten nicht gelesen werden können, wenn die Sitzung geschlossen wird, jedoch Redundanz bei Datenabfragen verursacht wird und unbrauchbare Attribute auf einmal ausgelesen werden Druck auf die Datenbank.
- Der Name = "p_role_permission" in @JoinTable konfiguriert den Namen der Zwischentabelle, joinColumns = {@JoinColumn (name = "r_sysId", referencedColumnName = "sysId")} in @JoinColumn (name = "r_sysId" konfiguriert die aktuelle Klassenkorrespondenz Das Fremdschlüsselfeld der Tabelle in der Zwischentabelle referencedColumnName = "sysId" konfiguriert das Primärschlüsselfeld, das dem Fremdschlüssel der Zwischentabelle in der aktuellen Klasse entspricht;
inverseJoinColumns = {@ JoinColumn (name = "p_sysId", referencedColumnName = "sysId")} Ja Bezieht sich auf eine andere Tabellenberechtigung, die der aktuellen Klasse many-to-many entspricht. Die erste @JoinColumn (name = "p_sysId" ist auch das Fremdschlüsselfeld, das der Berechtigungstabelle in der Zwischentabelle referenziertColumnName = entspricht "sysId") nur die Berechtigung und die Zwischentabelle Das Primärschlüsselfeld sysId, das dem Fremdschlüsselfeld p_sysId entspricht. - Kaskadenkaskadenbetrieb ist wichtiger, geben Sie einen separaten Titel an, um dies zu erklären.
2. Kaskadenkaskadenbetrieb
Die Kaskadenoperation von Hibernate richtet sich an Objekte und Objekte. Dies lässt sich an den konfigurierbaren Elementen der Kaskade ablesen. Verwechseln Sie sie nicht mit der Kaskadenoperation in der Datenbank, wenn Sie sie berücksichtigen.
Zwei Kaskadenkonfigurationen:
Konfigurieren Sie die Anmerkungen von @OneToOne, @OneToMany, @ManyToOne, @ManyToMany mithilfe von javax.persistence.CascadeType, der JPA-Konfiguration
@ManyToMany(fetch=FetchType.LAZY,casecade={CasecadeType.DETACH,CascadeType.MERGE})
Der Inhalt von casecade ist ein Array von CasecadeType. Es können mehrere Inhalte konfiguriert werden. Wenn nur ein Konfigurationselement vorhanden ist, kann es direkt als casecade = CasecadeType.DETACH geschrieben werden. Das Formular im Code sieht folgendermaßen aus
@ManyToMany(fetch=FetchType.LAZY,casecade=CascadeType.MERGE)
Eine andere Konfigurationsmethode ist die Verwendung von org.hibernate.annotations.CascadeType, dh das Konfigurationsformular für Annotationen im Ruhezustand lautet wie folgt
@ManyToMany(fetch=FetchType.LAZY)
@Cascade(value={ org.hibernate.annotations.CascadeType.DETACH})
@JoinTable(name="p_role_permission",joinColumns={@JoinColumn(name="r_sysId",referencedColumnName = "sysId")},inverseJoinColumns={@JoinColumn(name="p_sysId",referencedColumnName = "sysId")})
public Set<PPermission> getPermissions() {
return permissions;
}
Es ist ersichtlich, dass die Annotation @Casecade verwendet wird, wobei der Wert value ein Array vom Typ org.hibernate.annotations.CascadeType ist, das mit mehreren Werten konfiguriert oder ein Wert festgelegt werden kann.
Casecade-Funktion: Gibt an, ob die Objekte im mit Anmerkungen versehenen Feld kaskadiert werden sollen. Optionale Werte bei Verwendung der JPA-Einstellungen : javax.persistence.CascadeType.PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL. Eine oder mehrere von ihnen können ausgewählt werden. Bei Auswahl einer können die geschweiften Klammern verwendet werden oder nicht
Optionaler Wert | Beschreibung |
---|---|
FORTDAUERN | Der persistente Betrieb der kaskadierten Sitzung. Angenommen, die Annotation @ManyToMany der Schülerklasse und des Lehrerfelds ist mit cascade = {CascadeType.PERSIST} konfiguriert. Wenn das Objekt stu1 eine Lehrersammlung festlegt (die Objekte in dieser Sammlung sind vorübergehend), ist das Objekt stu1d beibehalten, Alle vorübergehenden Objekte in dieser Sammlung werden kaskadiert und in der Datenbank beibehalten. |
VERSCHMELZEN | Kaskaden-Zusammenführungsvorgang. Das gleiche wie oben |
AKTUALISIERUNG | Kaskadenaktualisierungsvorgang. Das gleiche wie oben |
ENTFERNEN | Kaskadenentfernungsvorgang. Das gleiche wie oben |
ABLÖSEN | Kaskadenräumungsoperation. Das gleiche wie oben |
ALLE | Kaskadieren Sie alle oben genannten Operationen |
Die ersten fünf Auswahlwerte oben sind jeweils der Methode in der Sitzung zugeordnet, und nur die entsprechende Methode kann ausgelöst werden |
Wenn Sie den von Hibernate selbst mit Anmerkungen versehenen CascadeType verwenden, lauten die optionalen Werte wie folgt:
Optionaler Wert | Beschreibung |
---|---|
LÖSCHEN | Die Löschmethode in einer kaskadierten Sitzung |
DELETE_ORPHAN | Veraltet und nicht empfohlen |
ABLÖSEN | Entspricht CPAadeType.DETACH von JPA |
EVICT | Veraltet, bitte verwenden Sie den vorherigen DETACH |
VERSCHMELZEN | Entspricht CascadeType.MERGE |
FORTDAUERN | Entspricht CascadeType.PERSIST |
AKTUALISIERUNG | Entspricht CascadeType.REFRESH |
ENTFERNEN | Entspricht CascadeType.REMOVE. |
REPLICATE | REPLICATE-Methode in einer kaskadierten Sitzung |
SAVE_UPDATE | Drei Methoden zum Kaskadieren von session.save () oder session.update () oder session.saveOrUpdate () |
ALLE | Kaskadieren Sie alle oben genannten Operationen |
Beachten Sie, dass eine unsachgemäße Verwendung des Kaskadenbetriebs die Leistung beeinträchtigt