2017-08-03 3 views
1

I Einheiten haben folgende:JPA: löschen Eltern mit verwandten Kindern

@Entity 
@Table(name = "chat", 
    uniqueConstraints = { 
      @UniqueConstraint(columnNames = {"user_1", "user_2"}) 
    }) 
public class Chat { 
    @ManyToOne 
    @JoinColumn(name = "user_1") 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    private User user1; 

    @ManyToOne 
    @JoinColumn(name = "user_2") 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    private User user2; 
} 

Benutzerklasse:

@Entity 
@Table(name="users", 
    uniqueConstraints={ 
    @UniqueConstraint(columnNames={"company_id", "username"}) 
    } 
) 
public class User { 
    @Id 
    @GenericGenerator(name = "uuid-gen", strategy = "uuid2") 
    @GeneratedValue(generator = "uuid-gen",strategy=GenerationType.IDENTITY) 
    private String id; 

    // there is no field/reference to Chat entity 
} 

und Benutzer Einheit ohne irgendwelche Referenzen Einheit Chat. Ich muss den Benutzer mit seinen Chats entfernen. Das Problem ist, dass die Benutzer-ID (die ich entfernen mag) entweder in user1 oder user2 Feld sein könnte. Zum Beispiel habe ich Benutzer A und B. Sie C. haben plaudern Und wenn ich versuche, zu entfernen, zum Beispiel Benutzer A, sollte den Benutzer A und Chat C. Aber mit spezifischer Konfiguration, ich habe folgende Fehler entfernen:

Cannot delete or update a parent row: a foreign key constraint fails 
(`mydb`.`chat`, CONSTRAINT `FKqslncg7pcc89gvjjpp9jypbha` 
FOREIGN KEY (`user_2`) REFERENCES `users` (`id`)) 

Als mögliche Lösung verwendete ich this answer. Aber die Verwendung von

entityManager.remove(user); 
entityManager.clear(); 

hilft nicht. Außerdem habe ich den ddl-Code überprüft und Cascade-Aktionen werden nicht erwähnt. Wie behebt man das?

+0

Sie, wenn Sie das übergeordnete löschen, werden alle verwandten „abhängigen“ Entitäten zu müssen gelöscht werden, wenn das der Fall ist, lesen Sie bitte [diese] (https://stackoverflow.com/questions/18813341/what- ist-der-Differenz-zwischen-Kaskade-und-orphan-removal-from-db) orphanRemoval –

+0

@MahmoudAlSiksek verwendet, wird dies nicht helfen. Ich verwende verschiedene Annotationen und habe keine Referenzen auf Kinder in der Elternklasse –

Antwort

0

fand ich eine Lösung. Das erste, was Sie benötigen, ist, die für Menschen lesbare ForeignKey-Einschränkung hinzuzufügen und @OnDelete zu entfernen. Jetzt sieht mein Code wie folgt aus:

@ManyToOne 
@JoinColumn(name = "user_1", foreignKey = @ForeignKey(name = "user_1_fk")) 
private User user1; 

@ManyToOne 
@JoinColumn(name = "user_2", foreignKey = @ForeignKey(name = "user_2_fk")) 
private User user2; 

Dann ließ ich diese Tabelle, ins Leben gerufen, eine Anwendung zu ermöglichen, Hibernate neu erstellen diese Tabelle mit der richtigen FK Namen in Anmerkungen versehen. Dann öffnete ich MySQL Workbench und modifizierte Fremdschlüssel für diese Tabelle mit folgenden SQL:

ALTER TABLE chat DROP FOREIGN KEY `user_1_fk`; 
ALTER TABLE chat DROP FOREIGN KEY `user_2_fk`; 
ALTER TABLE chat 
    ADD CONSTRAINT `user_1_fk` 
    FOREIGN KEY (`user_1`) 
    REFERENCES `users` (`id`) 
    ON DELETE CASCADE; 
ALTER TABLE chat 
    ADD CONSTRAINT `user_2_fk` 
    FOREIGN KEY (`user_2`) 
    REFERENCES `users` (`id`) 
    ON DELETE CASCADE; 

Das ist alles. bedeuten

Verwandte Themen