今天在设置主从表的过程中 出现了异常 显示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)
异常就消失 但是对于这个实体类的增删改查操作都没有办法继续了 所以对于这个异常的 出现 这个方法不推荐