这篇文章主要介绍了使用JPA单项一对多外键关联,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
JPA单项一对多外键关联
一对多即一个对象中包含又另外一个对象的集合。
User主表代码
@Table(name="USER")
@Entity
public class User {
private Integer id;
private String username;
private String userpassword;
private String useraddress;
private List<Order> listOrder;
@JoinColumn(name="LIST_ORDER")
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE)
public List<Order> getListOrder() {
return listOrder;
}
public void setListOrder(List<Order> listOrder) {
this.listOrder = listOrder;
}
@Id
@TableGenerator(name="PK_PRIMARY",
table="order_user_sque",
pkColumnName="pk_column_name",
pkColumnValue="pk_column",
valueColumnName="pk_column_value",
allocationSize=1)
@GeneratedValue(strategy=GenerationType.TABLE,generator="PK_PRIMARY")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="USERNAME")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name="USERPASSWORD")
public String getUserpassword() {
return userpassword;
}
public void setUserpassword(String userpassword) {
this.userpassword = userpassword;
}
@Column(name="USERADDRESS")
public String getUseraddress() {
return useraddress;
}
public void setUseraddress(String useraddress) {
this.useraddress = useraddress;
}
}
代码中:@JoinColumn(name="LIST_ORDER") -> 表示将外键名设置为LIST_ORDER
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE) -> OneToMany中fetch表示查询时的加载模式[懒加载还是积极加载],cascade属性表示要级联操作的模式,此处为删除主表后从表一并删除。
Order从表代码
@Entity
@Table(name="ORDER_USER")
public class Order {
private Integer id;
private String orderName;
//private User user;
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
}
JPA外键关联保存踩坑
比如:用户表关联了用户地址的主键
在用户还没有设置地址的时候 能单独添加用户和更新用户的个人信息 但是当用户添加地址的时候去更新数据的时候 jpa却是插入数据 而不是更新数据、这个时候用户表中的唯一字段则会报错、信息已存在!
这样关联的
一度迷茫
后来通过sql打印日记 查看到
jpa 在进行关联操作的时候 会通过外键查询一次、由于还没绑定外键 查询为空 这时候jpa就会以为是新增操作,则进行insert 操作
解决
去掉 optional = false
源码提示
翻译
/**
*(可选)关联是否可选。 如果设置
*为false,则必须始终存在非空关系。
*/
细节决定成败
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程学习网。
本文标题为:使用JPA单项一对多外键关联
基础教程推荐
- Java实现线程插队的示例代码 2022-09-03
- java实现多人聊天系统 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31
- Java文件管理操作的知识点整理 2023-05-19
- Java并发编程进阶之线程控制篇 2023-03-07
- java基础知识之FileInputStream流的使用 2023-08-11
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java数据结构之对象比较详解 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06