我有两个相关的课程:
@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引擎)
答案 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
因为它不会修改现有的表列定义。
如果将表中的表删除并再次尝试(如果您正在处理测试数据库),则应该找到正确创建的外键。