zoukankan      html  css  js  c++  java
  • JPA-映射-(@OneToMany、@ManyToOne)双向一对多

    一个用户对应多个订单,多个订单对应一个用户,不管查哪一边都可以得到另一边的信息

    用户类:Customer

    import lombok.Data;
    
    import javax.persistence.*;
    import java.util.HashSet;
    import java.util.Set;
    
    @Data
    @Entity(name = "TwoWay_CUTOMERS")
    @Table(name = "TwoWay_CUTOMERS")
    public class Customer {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        @Column(name = "LAST_NAME", length = 50, nullable = false)
        private String lastName;
    
        private String email;
    
        // 映射单向 1-n 的关联关系
        // 使用 @OneToMany 来映射 1-n 的关联关系
        // 使用 @JoinColumn 来映射外键列的名称
        // 可使用 @ManyToOne 的 fetch 属性来修改默认的关联属性的加载策略,在左外连接和两条SQL间切换
        // 使用 @OneToMany 的 cascade 属性来修改默认的删除策略,例在删除 1 的一端时,把 n 的一段也删除,级联删除
        // 若在 1 的一端的 @OneToMany 中使用 mappedBy 属性, 则 @OneToMany 端就不能再使用 @JoinColumn 属性
        //@JoinColumn(name = "CUSTOMER_ID")
        @OneToMany(mappedBy = "customer", fetch = FetchType.EAGER, cascade = {CascadeType.REMOVE})
        private Set<Order> orders = new HashSet<>();
    }

    订单类:Order

    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    import javax.persistence.*;
    
    @Getter
    @Setter
    @ToString
    @Entity(name = "TwoWay_ORDERS")
    @Table(name = "TwoWay_ORDERS")
    public class Order {
    
        @Id
        @GeneratedValue
        private Integer id;
    
        @Column(name = "ORDER_NAME")
        private String orderName;
    
        @JoinColumn(name = "CUSTOMER_ID")
        @ManyToOne()
        private Customer customer;
    }

    测试

    添加

    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    
    public class JPAyingshe {
        private EntityManagerFactory entityManagerFactory;
        private EntityManager entityManager;
        private EntityTransaction transaction;
    
        @Before
        public void init() {
            entityManagerFactory = Persistence.createEntityManagerFactory("jpaname");
            entityManager = entityManagerFactory.createEntityManager();
            transaction = entityManager.getTransaction();
            transaction.begin();
        }
    
        @After
        public void destroy() {
            transaction.commit();
            entityManager.close();
            entityManagerFactory.close();
        }
    
        // 若是双向 1-n 的关联关系, 执行保存时
        // 若先保存 n 的一端, 再保存 1 的一端, 默认情况下, 会多出 2n 条 UPDATE 语句
        // 若先保存 1 的一端, 则会多出 n 条 UPDATE 语句
        // 在进行双向 1-n 关联关系时, 建议使用 n 的一方来维护关联关系, 而 1 的一方不维护关联系, 这样会有效的减少 SQL 语句
        // 注意: 若在 1 的一端的 @OneToMany 中使用 mappedBy 属性, 则 @OneToMany 端就不能再使用 @JoinColumn 属性了
        @Test
        public void testOneToManyPersist() {
            Customer customer = new Customer();
            customer.setEmail("mm@163.com");
            customer.setLastName("MM");
    
            Order order1 = new Order();
            order1.setOrderName("O-MM-1");
    
            Order order2 = new Order();
            order2.setOrderName("O-MM-2");
    
            //建立关联关系
            customer.getOrders().add(order1);
            customer.getOrders().add(order2);
    
            order1.setCustomer(customer);
            order2.setCustomer(customer);
    
            entityManager.persist(order1);
            entityManager.persist(order2);
            //执行保存操作
            entityManager.persist(customer);
        }
    }

    由 n 方来维护关联关系,1 的一方不维护

    // 若在 1 的一端的 @OneToMany 中使用 mappedBy 属性, 则 @OneToMany 端就不能再使用 @JoinColumn 属性
    // @JoinColumn(name="CUSTOMER_ID")
    @OneToMany(mappedBy="customer")
    public Set<Order> getOrders() {
        return orders;
    }

    再调整下保存顺序

    @Test
    public void testOneToManyPersist() {
        Customer customer = new Customer();
        customer.setEmail("mm@163.com");
        customer.setLastName("MM");
    
        Order order1 = new Order();
        order1.setOrderName("O-MM-1");
    
        Order order2 = new Order();
        order2.setOrderName("O-MM-2");
    
        //建立关联关系
        customer.getOrders().add(order1);
        customer.getOrders().add(order2);
    
        order1.setCustomer(customer);
        order2.setCustomer(customer);
    
        //执行保存操作
        entityManager.persist(customer);
    
        entityManager.persist(order1);
        entityManager.persist(order2);
    }

  • 相关阅读:
    VC字符串输出对齐问题(转)
    木马免杀全攻略(转)
    Windows Vista自动重启问题解决方法(转)
    图说VSS 6.0构架版本控制系统解决方案(转)
    几个有用的链接
    X64 Windows 2003 及XP 语言包官方下载
    .NET 3.5的版本问题(转)
    设计模式读书笔记工厂方法模式
    设计模式读书笔记装饰者模式
    设计模式读书笔记简单工厂模式
  • 原文地址:https://www.cnblogs.com/jhxxb/p/10363147.html
Copyright © 2011-2022 走看看