2017-01-12 2 views
1

Ich habe diese Geordnete KlasseJPA ManyToOne Cascade Auf UPDATE mit JPQL

@Entity 
@Table(name = "category") 
@NamedQuery(name = "category.findAll", query = "SELECT c FROM Category c") 

public class Category implements Serializable { 

    public Category(){} 

    @Column(name = "name", nullable = false) 
    @Id 
    private String name; 

    @Column(name = "col2") 
    private Boolean col2; 

} 

und ich habe die übergeordnete Tabelle in Kind Tabelle wie folgt verwiesen:

@ManyToOne(cascade = {CascadeType.ALL}) 
    @JoinColumn(name = "cat_name") 
    private Category category 

, wenn ich diese laufen JPQL-Abfrage

update Category c SET c.name=:newName ,c.termsCanHaveChildren=:canHaveChdrn where c.name=:oldName 

es ist mit Fremdschlüssel Fehler zurück, während ich Cascade Alle in Kind Feld gesetzt haben

Cannot delete or update a parent row: a foreign key constraint fails (`terms`.`term`, CONSTRAINT `FKaykenypxci167nqioh4xx9p3a` FOREIGN KEY (`cat_name`) REFERENCES `category` (`name`)) 
+0

Cascading Flags gelten nicht für BULK UPDATE JPQL-Abfragen. –

Antwort

1

Das Problem liegt in der Beschränkung, die durch Ihre Persistenz-Provider erzeugt wird (hibernate), für die @JoinColumn(name = "cat_name") am Kindertisch (und nicht mit dem CascadeType, die Sie definieren) ...

Die erzeugte Einschränkung sollte gab an, dass jeder Verweis auf diese Spalte aktualisiert werden sollte ...

Ich glaube, dass diese Konfiguration funktionieren sollte (aber Sie müssen es zuerst testen, weil ich mein Datenbankmodell immer mithilfe von Skripten generierte und nicht mit Hibernate-Funktionen):

@ManyToOne 
@JoinColumn(
    name = "cat_name", 
    foreignKey = @ForeingKey(
     name = "fk_child_category", 
     foreignKeyDefinition = "FOREIGN KEY (cat_name) REFERENCES category ON UPDATE CASCADE" 
    ) 
) 
private Category category; 

Auch müssen Sie überprüfen, ob Ihre Datenbank „ON UPDATE CASCADE“ unterstützt ... Nach diesem link, Orakel nicht ... (Welche Datenbank verwenden Sie?)

Wenn dies nicht funktioniert Versuchen Sie den Vorschlag von Michelle ...

+0

danke, es funktioniert – MrDroid

0

Das erwartet wird: Sie können den Primärschlüssel (@Id) ändern sich, dass in einem Fremdschlüssel (@JoinColumn) verwendet wird .

Verwenden Sie einen unveränderten unveränderlichen Primärschlüssel.

Verwandte Themen