2016-11-24 1 views
0

Ich verwende Spring Boot 1.3.1.RELEASE mit Hibernate und H2 für Integrationstests. Unten sind meine Eigenschaften mit unidirektionaler OneToMany-Beziehung. Aus irgendeinem Grund enthält der generierte Fremdschlüssel DDL keine ON DELETE CASCADE. Gemäß H2 documentation werden referenzielle Aktionen unterstützt. Ich habe bidirektionale OneToMany auch versucht, aber ON DELETE CASCADE fehlt noch. Bitte beraten. Ich möchte vermeiden, Hibernate-spezifische Sachen zu verwenden, wenn möglich. Vielen Dank im Voraus.OneToMany erstellt keinen Fremdschlüssel mit ON DELETE CASCADE auf H2-Datenbank

Meine Einheiten:

@MappedSuperclass 
public abstract class DomainObjectLong implements Persistable<Long> { 
    @Id 
    @GenericGenerator(name="ID_GEN" , strategy="increment") 
    @GeneratedValue(generator = "ID_GEN") 
    private Long id; 

    @Override 
    @Transient 
    public boolean isNew() { 
     return id == null; 
    } 
} 


@Entity 
@Table(name = "event") 
public class EventVO extends DomainObjectLong { 
    @Column(name = "time", nullable = false, updatable = false) 
    private LocalDateTime time = LocalDateTime.now(); 

    @Column(name = "type", nullable = false, updatable = false) 
    @Enumerated(STRING) 
    private EventType type; 

    @OneToMany(cascade = ALL, fetch = EAGER, orphanRemoval = true) 
    @JoinColumn(name = "event_id", nullable = false) 
    private List<EventDataVO> data; 
} 


@Entity 
@Table(name = "event_data", uniqueConstraints = { 
     @UniqueConstraint(columnNames = {"event_id", "key"}) 
}) 
public class EventDataVO extends DomainObjectLong { 
    @Column(name = "key", length = 128, nullable = false, updatable = false) 
    private String key; 

    @Column(name = "value", length = 512, nullable = false, updatable = false) 
    private String value; 
} 

Eigenschaften:

datasource.runtime.url=jdbc:h2:mem:runtimetestdb;DB_CLOSE_ON_EXIT=FALSE 
datasource.runtime.driver-class-name=org.h2.Driver 
hibernate.dialect=org.hibernate.dialect.H2Dialect 
hibernate.show_sql=true 
hibernate.format_sql=true 
hibernate.hbm2ddl.auto=create-drop 

Log:

23:40:44.648 [localhost-startStop-1] DEBUG org.hibernate.SQL - 
    alter table event_data 
     add constraint FK_6xxhltyiilvlk02730x7mu7cu 
     foreign key (event_id) 
     references event 
Hibernate: 
    alter table event_data 
     add constraint FK_6xxhltyiilvlk02730x7mu7cu 
     foreign key (event_id) 
     references event 

Antwort

1

JPA erzeugt keine ON DELETE CASCADE Einschränkungen.

Der Grund ist, dass die Kaskadierung auf der JPA-Ebene mit dem Kaskadenattribut in der toMany- oder toOne-Mapping-Zuordnung erfolgt.

Wenn die Datenbank den Löschvorgang kaskadieren würde, würde der Status nicht mit dem Persistenzkontext übereinstimmen und ein Löschvorgang würde von JPA generiert, aber der Datenbankeintrag wurde bereits gelöscht.

+0

Danke, das macht Sinn. Selbst wenn ich selbst DDLs erstelle, sollte ich referentielle Aktionen wie ON DELETE CASCADE nicht verwenden, um mögliche Probleme in Ihrer Antwort zu vermeiden, oder? – Vojtech

+0

Genau. Lass Hibernate die Kontrolle übernehmen –

Verwandte Themen