业务中经常会出现对象有一对多的关系,如 小明有多张银行等。
表结构如下:
注意这里我没有指定外键关系。
如果要持久化这些对象,按照以往的做法先生成小明,赋予ID,再将这个ID设置为在银行卡的外键。
但是JPA指定了更为方便的做法。
从生成实体类开始(我使用的是IDEA)
1.添加数据源
2.生成实体类
左侧工具栏有这个窗口,没有请查看 https://blog.csdn.net/github_38336924/article/details/82788776
可选择生成实体类的位置和实体类的前缀,后缀。
生成对象
@Entity
@Table(name = "TEST_CUSTOMER")
public class TestCustomer {
private String id;
private String name;
@Id
@Column(name = "ID")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator") //可在ID上面加上ID生成策略
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Basic
@Column(name = "NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//忽略部分代码
@Entity
@Table(name = "TEST_CUSTOMER", schema = "WXD")
public class TestCustomer {
private String id;
private String name;
@Id
@Column(name = "ID")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator") //可在ID上面加上ID生成策略
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Basic
@Column(name = "NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
PS:列的注解也可以直接写在属性上也可以直接忽略(@Id 主键注解不可忽略),
实现一对多关系维护
//在TestCustomer中加入以下代码
private List<TestCard> cardList;
@OneToMany(cascade = {CascadeType.ALL,fetch = FetchType.EAGER})
@JoinColumn(name = "CUSTOMER_ID")
public List<TestCard> getCardList() {
return cardList;
}
public void setCardList(List<TestCard> cardList) {
this.cardList = cardList;
}
代码解释
@OneToMany 表明此属性是一对多的关系 cascade属性是
FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载
注意:这里为了方便测试 用了EAGER,平时写使用LAZY就行。我理解的区别就是:lazy模式用到了那个属性才会加载,eager是总会加载。
@JoinCloum 表明关联字段关系,name属性的值是数据库中字段名 PS:因为建表时我们并有创建真实的外键所以用这个注解 如果表中声明了外键 则可以直接在 @OneToMany 中键入 mappedBy = "customerId" 这个值是实体的属性名 不是数据库的字段名,使用mappedBy后 可不用@JoinCloum注解。
OK 测试一下!
package com.lsj.demo.myproject;
import com.lsj.demo.myproject.entity.TestCard;
import com.lsj.demo.myproject.entity.TestCustomer;
import com.lsj.demo.myproject.persist.TestCardDao;
import com.lsj.demo.myproject.persist.TestCustomerDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyprojectApplicationTests {
@Autowired
TestCardDao testCardDao;
@Autowired
TestCustomerDao testCustomerDao;
@Test
public void contextLoads() {
TestCustomer customer= new TestCustomer();
customer.setName("小明");
List<TestCard> cardList=new ArrayList<>();
TestCard card1 =new TestCard();
card1.setCardName("工商银行");
cardList.add(card1);
TestCard card2 =new TestCard();
card2.setCardName("中国银行");
cardList.add(card2);
customer.setCardList(cardList);
testCustomerDao.save(customer);
}
}
查看数据
OK 再来试试查询
@Test
public void contextLoads2() {
TestCustomer testCustomer = testCustomerDao.findById("bcc085dd679cd1a901679cd1ba760000").get();
System.out.println(JSONObject.toJSONString(testCustomer));
}
只是为了回顾一下前段时间遇到的问题,并没有往深了研究,如果没有帮助到你,实在抱歉