JPA 单向一对多关联关系

映射单向一对多的关联关系

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("[email protected]");
        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

 
时间: 2024-10-07 03:04:32

JPA 单向一对多关联关系的相关文章

7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)

单向一对多的关联关系 关联特点:1的一方有n的一方的集合属性,n的一方却没有1的一方的引用 比如:Customer对Order是一对多的关联关系,则Customer中有Order的集合属性,而Order中却没有对Customer的引用.这样可以通过客户检索到其所有的订单信息,却不能够由订单得到其所属的客户. 映射单向一对多的关联关系有两个要点: 1.利用@OneToMany注解进行单向一对多的映射: 2.利用@JoinColumn来映射外键列的名称: 注意的点: 1.@OneToMany的默认检

JPA学习笔记(8)——映射一对多关联关系

一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworld2; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; imp

Hibernate5.2关联关系之单向一对多(一)

Hibernate5.2之单向一对多 一. 简介    Hibernate中最复杂的应该就是各种关联(单向一对多.单向多对一.双向一对多.一对一.多对多)关系的映射,于是笔者就想着去写一些关于Hibernate相关的系列文章,可能最近今年项目上基本上没怎么用Hibernate,包括身边的很多人都在唱衰Hibernate,觉得他笨重.低效,但是笔者认为这都不影响其在我心目中的地位,以及他当初给笔者所带来的震撼,也影响千千万万的程序员.本系列博客中没有关于Hibernate原理性的东西的讲解,只是一

[原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

hibernate 一对多关联关系(详细分析)

在领域模型中, 类与类之间最普遍的关系就是关联关系. 在 UML 中, 关联是有方向的. 以 Customer 和 Order 为例: 一个用户能发出多个订单, 而一个订单只能属于一个客户. 从 Order 到 Customer 的关联是多对一关联; 而从 Customer 到 Order 是一对多关联 单向关联 双向关联 单向 n-1 单向 n-1 关联只需从 n 的一端可以访问 1 的一端 域模型: 从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Cus

(十一)Hibernate中的多表操作(1):单向一对多

一.单向一对多() 案例一(用XML文件配置): 一个会员(Member)可以有多个订单(Order),加载会员的时候自动加载订单,但是订单无法查看会员信息, public class Member { private String id; private String name; private Integer age; private Set<Order> orders = new HashSet<Order>(); //该Set集合里存放的是"多"方,加载

(转)Hibernate框架基础——一对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即集合元素是普通类型).现在从本文开始我们就要介绍实体类型的集合(即集合元素是另一个实体)了. 一对多关联关系映射 我们还是以一个活生生的例子来详解一对多关联关系映射吧!就以部门和员工的关系为例. 单向关联:仅仅建立从Employee到Department的多对一关联,即仅仅在Employee类中定义

Jpa配置一对多关系

在网上查了很多关于jpa的一对多表关联的操作,踩了很多坑,今天终于解决了 下面上一下我自己的代码,记录一下 老师和学生(一对多关系) 首先搭建环境,添加依赖包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSche

Hibernate单向“一对多”关联

1. 基于连接表的单向"一对多"关联,应该优先被采用其中指定many-to-many的unique="true",为单向"一对多",不指定就是单向"多对多" <class name="Person">    <id name="id" column="personId"><generator class="native"