加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 03:06:26 所属栏目:Java 来源:网络整理
导读:我有一个实体吧: @OneToMany(cascade = CascadeType.ALL,mappedBy = "bar")private SetFoo fooSet; 一个实体Foo: @ManyToOne(optional = false)@JoinColumn(name = "bar_id")private Bar bar; Hibernate在foo.bar上创建外键约束 – bar.id但它没有指定ON D
我有一个实体吧:
@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.为什么不?有没有办法实现它?

或者我可以在DB中手动添加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(相应地更改了原始问题)

解决方法

Hibernate手动管理级联操作.更重要的是,如果你要在数据库上进行级联,而不是在Hibernate中声明它们(出于性能问题),在某些情况下你可能会遇到错误.这是因为Hibernate将实体存储在其会话缓存中,因此它不会知道数据库是否会级联删除.

当您使用二级缓存时,您的情况会更糟,因为此缓存的寿命比会话长,并且db-side上的此类更改对于其他会话将是不可见的,因为旧的值存储在此缓存中.

我已经阅读了一些Hibernate来源(非常不愉快的经历),我怀疑在任何情况下都可以在数据库端管理级联 – Hibernate设计有太多的假设与DB现实不兼容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读