2013-02-14 4 views
5

ich mich nur gefragt bin, wenn es eine solche Art und Weise, dass ich meine MySQL-Tabelle bauen, wieJPA + Hibernate: Wie eine Einschränkung definieren ON DELETE CASCADE mit

ALTER TABLE `USERINFO` 
    ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE; 

aber ich habe nur in meinem DDL wenn Hibernate ++ JPA beginnt meinen Tisch zu bauen "<property name="hibernate.hbm2ddl.auto" value="create" />"

ALTER TABLE `USERINFO` ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`); 

In meinem Unterricht haben, habe ich diese Anmerkung Setup,

// UserAcc.java 
@Entity 
@Table(name = "USERACC") 
public class UserAcc implements Serializable { 

private static final long serialVersionUID = -5527566248002296042L; 

@Id 
@Column(name = "USERID") 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer userId; 


@OneToOne(mappedBy = "userAcc") 
private UserInfo userInfo; 
.... 


public UserInfo getUserInfo() { 
    return userInfo; 
} 
public void setUserInfo(UserInfo userInfo) { 
    this.userInfo = userInfo; 
} 
... 

und

// UserInfo.java 
@Entity 
@Table(name = "USERINFO") 
public class UserInfo implements Serializable { 

private static final long serialVersionUID = 5924361831551833717L; 

@Id 
@Column(name = "USERINFO_ID", nullable=false) 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer userInfoId; 

@OneToOne(cascade = {CascadeType.ALL}) 
@JoinColumn(name="USERID", nullable=false) 
@ForeignKey(name = "FK_USER_ID") 
private UserAcc userAcc; 


public Integer getUserInfoId() { 
    return userInfoId; 
} 

public void setUserInfoId(Integer userInfoId) { 
    this.userInfoId = userInfoId; 
} 
... 

Beachten Sie, dass, ist Useraccount Tabelle die Eltern/Haupttabelle hier während Userinfo eine erweiterte Tabelle an eine andere Stelle zu normalisieren ist. Jede Antwort würde sehr geschätzt werden. Ich bin nur neugierig, wie es gemacht wird, denn ich liebe es auch in MySQL zu arbeiten. Ich bin nur wirklich daran gewöhnt, einen Datensatz aus der Elterntabelle (USERACOUNT) zu löschen, der mir auch erlauben würde, ein Löschen durch untergeordnete Datensätze abhängig von dem spezifischen Datensatz von einer übergeordneten/primären Tabelle zu kaskadieren.

Danke!

+0

Haben Sie mit jpa eine Lösung für dieses Problem gefunden? Ich habe das gleiche Problem, und ich möchte keine bidirektionale Beziehung verwenden, die faules Holen auf dem Elternteil verursacht. –

Antwort

5

JPA bieten Möglichkeit zu cascade Operationen (zusammenführen, beibehalten, aktualisieren, entfernen) zu verknüpften Entitäten. Die Logik ist in JPA und verwendet keine Datenbankkaskaden.

Es gibt keine JPA-Standard-konforme Möglichkeit, Kaskaden mit Datenbankkaskaden durchzuführen. Wenn solche Kaskaden bevorzugt werden, müssen wir auf das Hibernate-spezifische Konstrukt zurückgreifen: @OnDelete. Es funktioniert zumindest mit @OneToMany, aber es gab in der Vergangenheit einige Probleme mit @OneToOne und @OnDelete.

@OnDelete(action = OnDeleteAction.CASCADE) 
+1

Danke Mikko. Ich habe versucht, OnDelete mit JPA-Annotationen zu integrieren, es hat tatsächlich nicht funktioniert. Ich habe eine Frage, als Sie Ihre Datenbank manipulieren wollten und ON DELETE CASCADE hinzufügen wollten, insbesondere MySQL, wie gehen Sie damit um? – toytoy

5

Es gibt keinen sauberen Schnitt bedeutet, dies in JPA zu tun. Das Folgende wird Sie bekommen, was Sie wollen ... Sie können CascadeType.DELETE verwenden, jedoch gilt diese Anmerkung nur für die Objekte in der EntityManager, nicht die Datenbank. Sie möchten sicherstellen, dass ON DELETE CASCADE der Datenbankeinschränkung hinzugefügt wird. Zur Überprüfung können Sie JPA so konfigurieren, dass eine ddl-Datei generiert wird. Werfen Sie einen Blick auf die ddl Datei, Sie werden feststellen, dass ON DELETE CASCADE nicht Teil der Einschränkung ist. Fügen Sie in der ddl Datei ON DELETE CASCADE zu tatsächlichen SQL hinzu, aktualisieren Sie dann Ihr Datenbankschema aus dem ddl. Dies wird dein Problem beheben.

Diese link zeigt, wie ON DELETE CASCADE für CONSTRAINT in MySQL zu verwenden ist. Sie tun dies für die Einschränkung. Sie können es auch in einer CREATE TABLE oder ALTER TABLE Anweisung tun. Es ist wahrscheinlich, dass JPA die Einschränkung in einer ALTER TABLE-Anweisung erstellt. Fügen Sie einfach ON DELETE CASCADE zu dieser Aussage hinzu.

Beachten Sie, dass einige JPA-Implementierungen ein Mittel für diese Funktionalität bereitstellen.

Schließlich bietet Hibernate diese Funktionalität unter Verwendung der OnDelete(action = OnDeleteAction.CASCADE) Annotation.

1

können Sie Hibernate Annotations [email protected](action = OnDeleteAction.CASCADE) auf UserAcc.userInfo verwenden:

public class UserAcc implements Serializable { 

... 

@OneToOne(mappedBy = "userAcc") 
@OnDelete(action = OnDeleteAction.CASCADE) 
private UserInfo userInfo; 

... 

dies DDL generieren ON DELETE CASCADE auf Fremdschlüssel in UserInfo Tabelle.

Verwandte Themen