我有一个实体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自己手动管理级联操作。而且,如果您要在数据库上进行级联,而不是在Hibernate中声明它们(出于性能问题),则在某些情况下可能会出错。这是因为Hibernate将实体存储在其会话缓存中,所以它不会知道数据库级联删除某些内容。
当您使用二级缓存时,情况甚至更糟,因为此缓存的生存期比会话长,并且只要会话中存储了较长的旧值,db-side的此类更改将对其他会话不可见。
我已经阅读了一些Hibernate的资料(确实很不愉快的经验),并且我怀疑在任何情况下都可以在数据库侧管理级联-Hibernate设计做出的太多假设与DB
Reality不兼容。
问题内容: 在这里记录此信息是因为我只花了一个小时试图解决这个问题。 我有一个实体Foo,拥有: Hibernate为什么不在foo.bar-> bar.id上创建外键约束? 问题答案: 这是因为MySQL在使用ENGINE = MyISAM创建的表上不支持外键约束。您需要使用ENGINE = InnoDB创建(均为!)表。您可以通过调整,添加默认值或在JDBC URL中使用特殊变量来执行此操作:
问题内容: 为什么hibernate对这些类使用联接表? 我既不需要联接表也不需要双向关联:( 问题答案: 因为这是它的设计方式,也是JPA规范要求它映射这样的关联的方式。如果要在广告投放表中添加联接列,请使用 这是有据可查的。
我无法使用Hibernate JPA嵌入使cascase删除在Java EE容器管理的应用程序中工作。我们将不胜感激。我有一个实体‘公司',与其他实体有四个任何关系。当测试应用程序(使用Arquillian框架)时,我无法使级联删除工作;公司实体被删除,删除后子实体仍然存在。我读到了这里:JPA和Hibernate Cascade DELETE OneToMany不起作用,这可能是一个测试问题,所
我只是想知道是否有这样一种方法,我可以将我的MySQL表构建为 但是,只有当hibernate++jpa开始构建具有“”的表时,我才在我的DDL中得到这一点 在我的类中,我有这些注释设置,
问题内容: 我有以下hibernate.cfg.xml: 我尝试了另一种方言(),但结果却很旧 pom.xml: 当调用以下代码行时: 我看到以下堆栈跟踪: 这个问题的原因是什么? 如何解决? 聚苯乙烯 数据库架构在MySql中不存在! 如果我明确添加数据库shema-一切正常。 从Java应用程序创建架构的方法在哪里? 问题答案: 我通常在使用Spring时使用属性文件自动创建数据库,以下是它的
问题内容: 什么是 级联 处于hibernate?我在标记中看到了一个属性。这是什么意思? 像什么意思?我还喜欢阅读其他属性 。 问题答案: 级联是关于涉及一个对象通过关联传播到其他对象的持久性动作。级联可以应用于各种Hibernate动作,并且通常是可传递的。定义关联的注释的“ cascade = …”属性表示应该对该关联进行级联的操作。 Cascade =“ all”表示应用所有主要的层叠类型