一尘不染

使用PostgreSQL,为什么Hibernate / JPA不创建级联约束?

hibernate

我有一个实体Bar

@OneToMany(cascade = CascadeType.ALL, mappedBy = "bar")
private Set<Foo> fooSet;

和一个实体Foo

@ManyToOne(optional = false)
@JoinColumn(name = "bar_id")
private Bar bar;

Hibernate在foo.bar-> bar.id上创建外键约束,但未指定ON DELETE CASCADE。为什么不?并且有什么方法可以实现?

或者,我可以ON DELETE CASCADE在数据库中手动添加(并禁用DDL生成), 这是一个好习惯吗?
而且,我是否必须以某种方式修改代码以让Hibernate知道相关记录已被数据库自动删除?

谢谢。

更新 -这是我的JPA / Hibernate / PostgreSQL配置:

<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg>
        <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="org.postgresql.Driver" />
            <property name="url" value="jdbc:postgresql://localhost:5432/my_db" />
            <property name="username" value="my_username" />
            <property name="password" value="my_password" />
        </bean>
    </constructor-arg>
</bean>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
    <property name="showSql" value="true" />
    <property name="generateDdl" value="true" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter" ref="jpaAdapter" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <property name="dataSource" ref="dataSource" />
</bean>

更新2- 阐明了我的意思:创建了外键约束,但是我想知道为什么它没有指定ON DELETE CASCADE(相应地更改了原始问题)


阅读 286

收藏
2020-06-20

共1个答案

一尘不染

Hibernate自己手动管理级联操作。而且,如果您要在数据库上进行级联,而不是在Hibernate中声明它们(出于性能问题),则在某些情况下可能会出错。这是因为Hibernate将实体存储在其会话缓存中,所以它不会知道数据库级联删除某些内容。

当您使用二级缓存时,情况甚至更糟,因为此缓存的生存期比会话长,并且只要会话中存储了较长的旧值,db-side的此类更改将对其他会话不可见。

我已经阅读了一些Hibernate的资料(确实很不愉快的经验),并且我怀疑在任何情况下都可以在数据库侧管理级联-Hibernate设计做出的太多假设与DB
Reality不兼容。

2020-06-20