JPA 单向一对多关联关系
关系 关联 jpa 一对 单向
2023-09-14 08:57:45 时间
映射单向一对多的关联关系
1、首先在一的一端加入多的一端的实体类集合
2、使用@OneToMany 来映射一对多的关联关系
3、使用@JoinColumn 来映射外键列的名称
4、可以使用@OneToMany的fetch 属性来修改默认的加载策略
5、可以通过@OneToMany的cascade 属性来修改默认的删除策略
6、cascade={CascadeType.REMOVE} 会把主表和从表的数据都删除
如下代码:
/** *数据库持久化类 * @author z * */ @Table(name="JPA_CUSTOMERS")//主要是映射表名对应的数据库表名JPA_CUSTOMER默认情况下可以不写表名与持久化类名相同 @Entity //表明这是一个持久化类 public class Customer { private Integer id; private String lastName; private String email; private int age ; private Date createdTime; private Date birth; /** * 单向一对多关系映射 * 1、添加多的一方的集合属性 */ private Set<Order> orders=new HashSet<>(); /** * 定义各数据列必须加在get方法上 * @return */ //定义主键,生成主键的策略AUTO自动的根据数据的类型生成主键 @GeneratedValue(strategy=GenerationType.AUTO) @Id //定义数据列 // @Column(name="ID")//定义数据库的列名如果与字段名一样可以省略 //使用table生成主键 // @TableGenerator(name="ID_GENERATOR", // table="JPA_ID_GENERATORS", // pkColumnName="PK_NAME", // pkColumnValue="CUSTOMER_ID", // valueColumnName="PK_VALUE", // allocationSize=100 // // // ) // // @GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR") // @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="LAST_NAME",length=50,nullable=false) //nullable false表示此字段不能为空 public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Temporal(TemporalType.TIMESTAMP) public Date getCreatedTime() { return createdTime; } public void setCreatedTime(Date createdTime) { this.createdTime = createdTime; } @Temporal(TemporalType.DATE) public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } //映射单向一对多的关联关系 //使用@OneToMany 来映射一对多的关联关系 //使用@JoinColumn 来映射外键列的名称 //可以使用@OneToMany的fetch 属性来修改默认的加载策略 //可以通过@OneToMany的cascade 属性来修改默认的删除策略 //cascade={CascadeType.REMOVE} 会把主表和从表的数据都删除 @JoinColumn(name="CUSTOMER_ID") @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE}) public Set<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } //工具方法,不需要映射为数据表的一列 @Transient public String getInfo(){ return "lastName:"+lastName+",email:"+email; } @Override public String toString() { return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + ", createdTime=" + createdTime + ", birth=" + birth + "]"; } }
2、单向多对一增删查改测试范例及注意事项
public class JPATest { private EntityManagerFactory entityManagerFactory; private EntityManager entityManager; private EntityTransaction transaction; @Before public void init(){ entityManagerFactory= Persistence.createEntityManagerFactory("jpa-1"); entityManager=entityManagerFactory.createEntityManager(); transaction=entityManager.getTransaction(); transaction.begin();//开启事务 } @After public void destroy(){ transaction.commit(); entityManager.close(); entityManagerFactory.close(); } //修改 @Test public void testUpdate(){ Customer customer=entityManager.find(Customer.class, 4); customer.getOrders().iterator().next().setOrderName("O-XXX-10"); } //删除 //默认情况下,若删除1的一端,则会先把关联的多的一段的外键置空,然后删除一的一端 ////可以通过@OneToMany的cascade 属性来修改默认的删除策略 @Test public void testOneToManyRemove(){ Customer customer=entityManager.find(Customer.class, 7); entityManager.remove(customer); } //默认对关联多的一方使用懒加载的加载策略(延迟加载) //可以使用@OneToMany的fetch 属性来修改默认的加载策略 //查询 @Test public void testOneToManyFind(){ Customer customer=entityManager.find(Customer.class,6); System.out.println(customer.getLastName()); System.out.println(customer.getOrders().size()); } //单向一对多保存时,一定会多出update语句 //因为多的一端在插入时不会同时插入外键列 //保存 @Test public void testOneToManyPersist(){ Customer customer=new Customer(); customer.setAge(16); customer.setBirth(new Date()); customer.setCreatedTime(new Date()); customer.setEmail("CC@163.com"); customer.setLastName("AA"); Order order1=new Order(); order1.setOrderName("o-CC-1"); Order order2=new Order(); order2.setOrderName("o-CC-2"); //建立关联关系 customer.getOrders().add(order1); customer.getOrders().add(order2); //执行保存操作 entityManager.persist(customer); entityManager.persist(order1); entityManager.persist(order2); } }
源码地址:https://github.com/wuhongpu/JPA.git
相关文章
- 第九章 关系映射 组件关联映射
- 第九章 关系映射 一对多关联映射
- UML关系(泛化,实现,依赖,关联(聚合,组合))
- 矩阵特征值与行列式、迹的关系
- hibernate系列(二)一对多的关联关系
- hibernate之映射关系一对多(自身关联)
- [NHibernate]一对多关系(关联查询)
- Scala 中将方法、函数、函数式编程和面向对象编程关系分析图
- 使用代码给 SAP CRM appointment 和 Opportunity 创建关联关系
- 使用jMeter构造逻辑上有依赖关系的一系列并发请求
- AI:人工智能领域主要方向(技术和应用)、与机器学习/深度学习的关系、数据科学关键技术与知识发现/数据挖掘/统计学/模式识别/神经计算学/数据库的关系(几张图理清之间的暧昧关系)
- Android硬件访问服务 JNI实现 图解调用关系
- 【Linux 内核 内存管理】内存映射相关数据结构 ① ( vm_area_struct 结构体 | task_struct、mm_struct、vm_area_struct 3 个结构体之间的关系)
- .NET Framework中重点类型的继承关系
- 第21讲:多表查询的关联关系以及基本概述
- Attention中的qkv与机器翻译中的对应关系
- 【C++要笑着学】虚函数表(VBTL) | 观察虚表指针 | 运行时决议与编译时决议 | 动态绑定与静态绑定 | 静态多态与动态多态 | 单继承与多继承关系的虚表