spring boot Jpa 一对多关系维护 @OneToMany

0 篇文章 0 订阅

     业务中经常会出现对象有一对多的关系,如 小明有多张银行等。

     表结构如下:

     注意这里我没有指定外键关系。

     如果要持久化这些对象,按照以往的做法先生成小明,赋予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));
    }

 

 

只是为了回顾一下前段时间遇到的问题,并没有往深了研究,如果没有帮助到你,实在抱歉

好的,以下是 Spring Boot JPA 实现一对多增删改查的示例代码: 1. 创建实体类 ``` @Entity public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true) private List<Child> children = new ArrayList<>(); // getters and setters } @Entity public class Child { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") private Parent parent; // getters and setters } ``` 2. 创建 Repository 接口 ``` public interface ParentRepository extends JpaRepository<Parent, Long> { } ``` 3. 创建 Service 类 ``` @Service public class ParentService { @Autowired private ParentRepository parentRepository; public Parent save(Parent parent) { return parentRepository.save(parent); } public void delete(Long id) { parentRepository.deleteById(id); } public Parent findById(Long id) { return parentRepository.findById(id).orElse(null); } public List<Parent> findAll() { return parentRepository.findAll(); } } ``` 4. 创建 Controller 类 ``` @RestController @RequestMapping("/parents") public class ParentController { @Autowired private ParentService parentService; @PostMapping public Parent create(@RequestBody Parent parent) { return parentService.save(parent); } @PutMapping("/{id}") public Parent update(@PathVariable Long id, @RequestBody Parent parent) { Parent existingParent = parentService.findById(id); if (existingParent == null) { throw new RuntimeException("Parent not found"); } existingParent.setName(parent.getName()); existingParent.setChildren(parent.getChildren()); return parentService.save(existingParent); } @DeleteMapping("/{id}") public void delete(@PathVariable Long id) { parentService.delete(id); } @GetMapping("/{id}") public Parent findById(@PathVariable Long id) { return parentService.findById(id); } @GetMapping public List<Parent> findAll() { return parentService.findAll(); } } ``` 以上就是 Spring Boot JPA 实现一对多增删改查的示例代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值