Hibernate OneToMany和相关的删除约束

时间:2017-08-31 07:38:51

标签: java database hibernate orm

我有两个相关的课程:

@Entity
@Table(name = "projects")
public class Project {

@Expose
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
...
@Expose
@OneToMany(mappedBy = "project", fetch = FetchType.EAGER)
private Set<WorkPackage> workPackages;
}

@Entity
@Table(name = "work_packages")
public class WorkPackage {

@Expose
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Expose(serialize = false)
@ManyToOne
@JoinColumn(name = "project_id")
private Project project;
}

现在问题: 我有Project对象,其中包含一个或多个存储在DB中的WorkPackage对象。 当我删除项目时,没有任何违规行为。项目已删除,但相关的WP仍在DB中,并且指的是不存在(删除后)项目。这不是我期望的行为。当我尝试删除包含至少一个WP的项目时,我需要违规。

显然我可以直接在DB中完成它,但我想知道是否有办法通过Hibernate和Annotations来实现它?

谢谢!

问题是Hibernate使用MyISAM引擎创建了表,这显然不允许生成FK。 所以我刚刚改变了

property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"

property name="hibernate.dialect" value="org.hibernate.dialect.MySQL55Dialect"

它的工作原理(现在Hibernate使用InnoDB引擎)

2 个答案:

答案 0 :(得分:0)

试试这个:

import {MDCTextfieldFoundation} from '@material/textfield/dist/mdc.textfield';

使用... @Expose @OneToMany(mappedBy = "project", fetch = FetchType.EAGER, cascade=CascadeType.ALL,orphanRemoval=true) 数据库中父记录的所有子记录将在删除父记录后删除。

答案 1 :(得分:0)

我假设您在一些测试运行后添加了Fk

问题在于hibernate.hbm2ddl.auto = update 因为它不会修改现有的表列定义。

  • 它只会添加一个尚不存在的列。
  • 它不会修改或删除db。中已存在的列。

如果将表中的表删除并再次尝试(如果您正在处理测试数据库),则应该找到正确创建的外键。