菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
378
0

JPA笔记2 OneToMany

原创
05/13 14:22
阅读数 66717

 

package one_to_many;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Table(name = "JPA_CUSTOMERS")
@Entity
public class Customer2 {

    @Override
    public String toString() {
        return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + ", cla=" + cla + ", ff=" + ff + "]";
    }

    private Integer id;
    private String lastName;
    private String email;
    private int age;
    private int cla;
    private String ff;
    private Set<Order2> orders = new HashSet<>();

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    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;
    }

    public int getCla() {
        return cla;
    }

    public void setCla(int cla) {
        this.cla = cla;
    }

    public String getFf() {
        return ff;
    }

    public void setFf(String ff) {
        this.ff = ff;
    }

    // 删除1的一端,默认会先修改多的一端,然后再删除1的一端
    // 可以通过修改@OneToMany的cascade属性来修改默认的删除策略
    @JoinColumn(name = "customer_id")
    @OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.REMOVE })
    public Set<Order2> getOrders() {
        return orders;
    }

    public void setOrders(Set<Order2> orders) {
        this.orders = orders;
    }
}

 

package one_to_many;

import javax.persistence.Column;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Table(name = "JPA_ORDER")
@Entity
public class Order2 {

    private Integer id;
    private String orderName;

    // private Customer customer;

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "order_name")
    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    // //映射单向n-1的关联关系
    // @JoinColumn(name = "customer_id")//, foreignKey =
    // @ForeignKey(ConstraintMode.NO_CONSTRAINT))
    // @ManyToOne(fetch=FetchType.LAZY)
    // public Customer getCustomer() {
    // return customer;
    // }
    //
    // public void setCustomer(Customer customer) {
    // this.customer = customer;
    // }

    @Override
    public String toString() {
        return "Order [id=" + id + ", orderName=" + orderName + "]";
    }

}

 

package one_to_many;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Main2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String persistenceUnitName = "jpa-1";
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);

        EntityManager entityManager = entityManagerFactory.createEntityManager();

        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        // oneToManyPersist(entityManager);
        // oneToManyRemove(entityManager);
        oneToManyUpdate(entityManager);

        transaction.commit();
        entityManager.close();
        entityManagerFactory.close();
    }

    // 1.单向1-n关联关系执行保存时,一定会多出update语句
    // 因为n的一端在插入时不会同时插入外键
    private static void oneToManyPersist(EntityManager entityManager) {
        Customer2 customer = new Customer2();
        customer.setEmail("fs2@ss.com");
        customer.setLastName("123");
        customer.setAge(23);
        customer.setCla(33);
        customer.setFf("aa");

        Order2 order2 = new Order2();
        order2.setOrderName("1");

        Order2 order3 = new Order2();
        order3.setOrderName("2");

        customer.getOrders().add(order2);
        customer.getOrders().add(order3);

        entityManager.persist(order2);
        entityManager.persist(order3);
        entityManager.persist(customer);

    }

    // 默认对关联的多的一方做懒加载
    private static void oneToManyFind(EntityManager entityManager) {
        Customer2 customer2 = entityManager.find(Customer2.class, 5);
        System.out.println(customer2);
        System.out.println(customer2.getOrders().size());
    }

    // 删除1的一端,默认会先修改多的一端,然后再删除1的一端
    // 可以通过修改@OneToMany的cascade属性来修改默认的删除策略
    private static void oneToManyRemove(EntityManager entityManager) {
        Customer2 customer2 = entityManager.find(Customer2.class, 5);
        entityManager.remove(customer2);
    }

    private static void oneToManyUpdate(EntityManager entityManager) {
        Customer2 customer2 = entityManager.find(Customer2.class, 6);

        customer2.getOrders().iterator().next().setOrderName("xx");
    }
}

 

发表评论

0/200
378 点赞
0 评论
收藏
为你推荐 换一批