【问题标题】:OneToMany doesn't create foreign key with ON DELETE CASCADE on H2 databaseOneToMany 不会在 H2 数据库上使用 ON DELETE CASCADE 创建外键
【发布时间】:2017-04-09 07:08:48
【问题描述】:

我正在使用带有 Hibernate 和 H2 的 Spring Boot 1.3.1.RELEASE 进行集成测试。下面是我的具有单向 OneToMany 关系的实体。由于某种原因,生成的外键 DDL 不包含 ON DELETE CASCADE。根据H2 documentation 支持引用操作。我也尝试了双向 OneToMany,但仍然缺少 ON DELETE CASCADE。请指教。如果可能的话,我想避免使用 Hibernate 特定的东西。提前谢谢你。

我的实体:

@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;
}

属性:

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

日志:

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

【问题讨论】:

    标签: hibernate spring-data-jpa h2 jpa-2.1


    【解决方案1】:

    JPA 不会生成 ON DELETE CASCADE 约束。

    原因是级联是在 JPA 级别使用 toMany 或 toOne 映射映射中的级联属性完成的。

    如果数据库将级联删除,则状态将与持久性上下文不匹配,JPA 将生成删除,但数据库记录已被删除。

    【讨论】:

    • 谢谢,这是有道理的。因此,即使我自己创建 DDL,我也不应该使用 ON DELETE CASCADE 之类的引用操作来避免您的回复中描述的可能问题,对吧?
    • 没错。让 Hibernate 控制
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多