JPA一对多关系

个人总结

  1. 关系字段上加注解 @onetomany或者@manytoone。
  2. 如果是n-1,那么默认fetch=eager,采用立即查询
  3. 如果是1-n,默认是延迟加载策略,都可以通过改变fetch属性来改变。
  4. 单向1-n时,无论如何插入都会多出来两条update语句,因为这时关联关系是由1的一端维护,而外键列在n的一端,需要执行update语句,插入1这一端的id。
  5. joinColum 来映射相应的外键列列名
  6. 双向一对多,最好让n的一方维持关系,通过设置mappedType=映射的属性名,而且这时不能设置joinColumn,否则会报错。如果没有设置,那么按照插入顺序,先插1的一端,再插n的一端,会多余两条update语句,先插n的一端,再插1的一端,则会多出来4条update语句,因为这时双方都在维护。
  7. 而且双向一对多时,两边的joinColumn字段的值应该相一致。

综述

  1. 双向一对多关系中,必须存在一个关系维护端,在 JPA 规范中,要求 many 的一方作为关系的维护端(owner side), one 的一方作为被维护端(inverse side)。

  2. 可以在 one 方指定 @OneToMany 注释并设置 mappedBy 属性,以指定它是这一关联中的被维护端,many 为维护端。

  3. 在 many 方指定 @ManyToOne 注释,并使用 @JoinColumn 指定外键名称

多对一映射

  1. 和hibernate差不多
  2. 2.
    private Grade grade;

    @JoinColumn(name="grade_id")
    @ManyToOne(fetch=FetchType.LAZY)
    public Grade getGrade() {
        return grade;
    }
@Test
    public void testManyToOne(){

        Grade grade=new Grade();
        grade.setName("ok");

        Student student =new Student();
        Student student1 =new Student();

        student.setName("good");
        student.setGender(1);
        student.setEmail("7879");
        //设置关联关系
        student.setGrade(grade);

        student1.setName("gdd");
        student1.setGender(1);
        student1.setEmail("78de79");
        //设置关联关系
        student1.setGrade(grade);

        entityManager.persist(grade);
        entityManager.persist(student);
        entityManager.persist(student1);

    }

一对多映射

//这时候要去掉joinColumn
@OneToMany(fetch=FetchType.EAGER,mappedBy="grade")
    public Set<Student> getStudent() {
        return student;
    }
    @JoinColumn(name="grade_ids")
    @OneToMany(fetch=FetchType.EAGER)
    public Set<Student> getStudent() {
        return student;
    }
//测试,这时候只有三条insert语句    
    @Test
    public void TestOneToMany(){

        Grade grade=new Grade();
        grade.setName("juewei");

        Student student =new Student();
        Student student1 =new Student();

        student.setName("good1");
        student.setGender(1);
        student.setEmail("7879");


        student1.setName("good2");
        student1.setGender(1);
        student1.setEmail("78de79");


        //设定关系
        grade.getStudent().add(student1);
        grade.getStudent().add(student);

        entityManager.persist(grade);
        entityManager.persist(student);
        entityManager.persist(student1);


    }

双向一对多映射

@Test
    public void TestOneToManyBetween(){

        Grade grade=new Grade();
        grade.setName("juewei");

        Student student =new Student();
        Student student1 =new Student();

        student.setName("good1");
        student.setGender(1);
        student.setEmail("7879");
        student.setGrade(grade);

        student1.setName("good2");
        student1.setGender(1);
        student1.setEmail("78de79");
        student1.setGrade(grade);

        //设定关系
        grade.getStudent().add(student1);
        grade.getStudent().add(student);

        entityManager.persist(grade);
        entityManager.persist(student);
        entityManager.persist(student1);


    }

NullPointerException

问题很简单,没有初始化成员变量set集合,导致给null添加元素
private Set<Student> student;
grade.getStudent().add(student1);
### Java 导出 Excel 文件添加下拉框Java中,可以使用Apache POI库来创建Excel文件,向单元格中添加下拉列表。以下是具体实现方法: #### 使用 Apache POI 库导出带有下拉框Excel 文件 为了完成此操作,首先需要引入Apache POI依赖项。如果使用Maven,则可以在`pom.xml`中加入如下配置[^1]。 ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> ``` 接着编写用于生成含下拉菜单的工作簿代码片段: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFDataValidation; import org.apache.poi.xssf.usermodel.XSSFDataValidationConstraint; import org.apache.poi.xssf.usermodel.XSSFDataValidationHelper; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExportWithDropdown { public static void main(String[] args) throws Exception{ try (XSSFWorkbook workbook = new XSSFWorkbook()) { XSSFSheet sheet = workbook.createSheet("SheetName"); // 创建约束条件 DataValidationConstraint constraint = new XSSFDataValidationHelper(sheet).createExplicitListConstraint(new String[]{"Option1", "Option2", "Option3"}); CellRangeAddressList addressList = new CellRangeAddressList(0, 100, 0, 0); // 定义应用范围 DataValidation validation = new XSSFDataValidation(constraint, addressList); sheet.addValidationData(validation); FileOutputStream fileOut = new FileOutputStream("workbook.xlsx"); workbook.write(fileOut); fileOut.close(); } } } ``` 这段程序会创建一个新的工作表,在A列的第一至一百行内设置了一个名为"SheetName"的数据验证规则,允许用户从中选择预定义好的三个选项之一作为输入值。 除了Apache POI之外,还有其他框架如EasyExcel也提供了便捷的方式来处理复杂的Excel文档需求,比如自动调整宽度、样式美化等功能的同时还能够轻松地集成下拉框功能[^2][^3]。 对于更复杂的应用场景,建议考虑采用这些高级特性丰富的第三方库来进行开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值