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
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
Genau. Lass Hibernate die Kontrolle übernehmen –