Hibernate注解完成主从表外键关联

来源:互联网 发布:java考试参考题 编辑:程序博客网 时间:2024/05/15 01:51

今天在设置主从表的过程中  出现了异常   显示should be mapped with insert=false updatable=false异常

提示我要在外键的注解上加上 insert=false updatable=false   然而我的从表的外键需要进行增删改查操作导致其他功能无法实现

数据库的主键外键一直都被我们挂在嘴边 但是却不是真正的了解  这次借机可以好好了解一下


首先概括的说一下主外键的作用

主键是能确定一条记录的唯一标识,而外键用于与另外一张表的关联,用于确定另一张表记录的数据。

如果A表中的一个字段,是B表的主键 ,那么这个字段就可以是A表的外键。

一个表的外键是另一个表的主键


了解了主外键的基本概念  就可以具体讨论遇到的问题了


具体情况是项目中有许多机台,分别具有唯一的标识机台编号  在另一个表中是机台维修记录表  每次维修会产生维修工单 带有维修机台的编号

这时候我首先想到将工单表作为子表挂载在机台表下

通过hibernate注解进行外键关联的方法是

下面的例子中MesMachineReport是主表实体类   MtoverhalRecord是子表实体类

1.首先在主表中新建子表实体类的set集合,在子表实体类的get方法上注解@OneToMany

@OrderBy("deviceName")@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mesMachineReport")

其中

mappedBy是指数据的拥有方  也是数据的维护方

fetch = FetchType.LAZY  是指当主表加载时  不会立刻加载子表数据 懒加载的优点在于数据可以延迟加载 优化程序性能

需要使用的时候只需要调用一下子表对象的属性例如

mesMachineReport.getMtOverhaulRecord().size();

2.在子表实体类中新建主表的对象,并在get方法加上@ManyToOne

@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "MACHINE_ID", nullable = false)

其中@JoinColumn表示外键对应的列


异常出现的地方就在这里

正是因为子表的实体类中已经有machineId这个选项  为了保证外键能够确定子表的数据   

就需要对子表原有实体类中的machineId字段进行insert=false updatable=false的约束

@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "MACHINE_ID", nullable = false,insertable=false ,updatable=false)

异常就消失  但是对于这个实体类的增删改查操作都没有办法继续了  所以对于这个异常的 出现   这个方法不推荐




原创粉丝点击