【发布时间】:2012-04-10 20:22:22
【问题描述】:
我有一个实体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(相应地更改了原始问题)
【问题讨论】:
-
您是否告诉 Hibernate 为您创建/更新数据库架构?
-
你好@Thomas,是的,我做到了。请查看更新后的问题以查看 JPA/Hibernate/PostgreSQL 配置。谢谢!
标签: java hibernate postgresql jpa foreign-keys