1. 程式人生 > >基於註解的Hibernate JPA操作CRUD(單表、一對多和多對多)

基於註解的Hibernate JPA操作CRUD(單表、一對多和多對多)

0.maven引入相關依賴資源

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.njnu.ogms</groupId>
  <artifactId>hibernateTestDay4_1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>hibernateTestDay4_1 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--log4j-core和log4j-api-->
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.11.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.11.1</version>
    </dependency>
    <!--mysql的資料庫驅動-->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.12</version>
    </dependency>
    
    <!--c3p0-->
    <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-c3p0</artifactId>
      <version>5.3.6.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>mchange-commons-java</artifactId>
      <version>0.2.15</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>hibernateTestDay4_1</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <resources>
      <resource>
        <directory>
          src/main/java
        </directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>
  </build>
</project>

1.編寫總配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
              http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
             version="2.2">
    <!--transaction-type:事務型別-->
        <!--JTA:JAVA Transaction API-->
        <!--RESOURCE_LOCAL:原生代碼事務-->
    <persistence-unit name="myJPAUnit" transaction-type="RESOURCE_LOCAL">
        <!--JPA提供商,可以不寫-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <!--JPA註解的實體類位置,可以不寫-->
        <class>domain.CstCustomer</class>
        <class>domain.CstLinkman</class>
        <class>domain.SysRole</class>
        <class>domain.SysUser</class>

        <!--以下只要把cfg.xml檔案中的拷貝過來稍加改動即可-->
        <!--1.連線資料庫的資訊-->
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hibernate"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="123456"/>
            <!--2.hibernate可選配置-->
            <!--檢測實體類的對映配置和資料庫的表結構是否一致,如果不一致,更新表結構-->
            <property name="hbm2ddl.auto" value="update"/>
            <!--資料庫方言-->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <!--是否顯示hibernate生成的sql語句-->
            <property name="hibernate.show_sql" value="true"/>
            <!--是否使用格式化輸出sql語句-->
            <property name="hibernate.format_sql" value="true"/>
            <!--3.設定hibernate的連線池提供商-->
            <property name="hibernate.connection.provider_class" value="org.hibernate.c3p0.internal.C3P0ConnectionProvider"/>
        </properties>
    </persistence-unit>
</persistence>

2.反向生成java實體類

(客戶和聯絡人,一對多)

    並在其中寫@OneToMany和@ManyToOne註解

    使用者表:

package domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
 * @Author: David.Xiao
 * @Date: 2018/11/13 20:14
 * @Description:
 */
@Entity
@Table(name = "cst_customer", schema = "hibernate", catalog = "")
public class CstCustomer {
    private long custId;
    private String custName;
    private String custSource;
    private String custIndustry;
    private String custLevel;
    private String custAddress;
    private String custPhone;

    private Set<CstLinkman> linkmanSet = new HashSet<>(0);

    /**
     * mappedBy = "customer" 此方是“被對映”的,不負責維護關係,將維護級聯關係的權利交給CstLinkman類中的customer成員
     * cascade = CascadeType.PERSIST 級聯儲存 remove級聯刪除  all級聯儲存-刪除
     * fetch = FetchType.EAGER 立即查詢
     */
    @OneToMany(targetEntity = CstLinkman.class,mappedBy = "customer",cascade = CascadeType.PERSIST,fetch = FetchType.EAGER)
    public Set<CstLinkman> getLinkmanSet() {
        return linkmanSet;
    }

    public void setLinkmanSet(Set<CstLinkman> linkmanSet) {
        this.linkmanSet = linkmanSet;
    }

    @Id
    @Column(name = "cust_id", nullable = false)
    //指定主鍵生成策略 strategy:使用JPA中提供的主鍵生成策略;generator使用hibernate中的主鍵生成策略
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getCustId() {
        return custId;
    }

    public void setCustId(long custId) {
        this.custId = custId;
    }

    @Basic
    @Column(name = "cust_name", nullable = false, length = 32)
    public String getCustName() {
        return custName;
    }

    public void setCustName(String custName) {
        this.custName = custName;
    }

    @Basic
    @Column(name = "cust_source", nullable = true, length = 32)
    public String getCustSource() {
        return custSource;
    }

    public void setCustSource(String custSource) {
        this.custSource = custSource;
    }

    @Basic
    @Column(name = "cust_industry", nullable = true, length = 32)
    public String getCustIndustry() {
        return custIndustry;
    }

    public void setCustIndustry(String custIndustry) {
        this.custIndustry = custIndustry;
    }

    @Basic
    @Column(name = "cust_level", nullable = true, length = 32)
    public String getCustLevel() {
        return custLevel;
    }

    public void setCustLevel(String custLevel) {
        this.custLevel = custLevel;
    }

    @Basic
    @Column(name = "cust_address", nullable = true, length = 128)
    public String getCustAddress() {
        return custAddress;
    }

    public void setCustAddress(String custAddress) {
        this.custAddress = custAddress;
    }

    @Basic
    @Column(name = "cust_phone", nullable = true, length = 64)
    public String getCustPhone() {
        return custPhone;
    }

    public void setCustPhone(String custPhone) {
        this.custPhone = custPhone;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        CstCustomer that = (CstCustomer) o;
        return custId == that.custId &&
                Objects.equals(custName, that.custName) &&
                Objects.equals(custSource, that.custSource) &&
                Objects.equals(custIndustry, that.custIndustry) &&
                Objects.equals(custLevel, that.custLevel) &&
                Objects.equals(custAddress, that.custAddress) &&
                Objects.equals(custPhone, that.custPhone);
    }

    @Override
    public int hashCode() {

        return Objects.hash(custId, custName, custSource, custIndustry, custLevel, custAddress, custPhone);
    }

    @Override
    public String toString() {
        return "CstCustomer{" +
                "custId=" + custId +
                ", custName='" + custName + '\'' +
                ", custSource='" + custSource + '\'' +
                ", custIndustry='" + custIndustry + '\'' +
                ", custLevel='" + custLevel + '\'' +
                ", custAddress='" + custAddress + '\'' +
                ", custPhone='" + custPhone + '\'' +
                '}';
    }
}

聯絡人表:

package domain;

import javax.persistence.*;
import java.util.Objects;

/**
 * @Author: David.Xiao
 * @Date: 2018/11/13 20:14
 * @Description:
 */
@Entity
@Table(name = "cst_linkman", schema = "hibernate", catalog = "")
public class CstLinkman {
    private long lkmId;
    private String lkmName;
    private String lkmGender;
    private String lkmPhone;
    private String lkmMobile;
    private String lkmEmail;
    private String lkmPosition;
    private String lkmMemo;

    private CstCustomer customer;
    /**
     * 建立多對一的對映關係
     * targetEntity = CstCustomer.class 指定所對的一方的實體類名
     * name = "lkm_cst_id" 外來鍵欄位名   referencedColumnName = "cust_id" 外來鍵對應的主表的主鍵欄位名
     */
    @ManyToOne(targetEntity = CstCustomer.class)
    @JoinColumn(name = "lkm_cst_id",referencedColumnName = "cust_id")
    public CstCustomer getCustomer() {
        return customer;
    }

    public void setCustomer(CstCustomer customer) {
        this.customer = customer;
    }


    @Id
    @Column(name = "lkm_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getLkmId() {
        return lkmId;
    }
    public void setLkmId(long lkmId) {
        this.lkmId = lkmId;
    }

    @Basic
    @Column(name = "lkm_name", nullable = true, length = 16)
    public String getLkmName() {
        return lkmName;
    }

    public void setLkmName(String lkmName) {
        this.lkmName = lkmName;
    }

    @Basic
    @Column(name = "lkm_gender", nullable = true, length = 10)
    public String getLkmGender() {
        return lkmGender;
    }

    public void setLkmGender(String lkmGender) {
        this.lkmGender = lkmGender;
    }

    @Basic
    @Column(name = "lkm_phone", nullable = true, length = 16)
    public String getLkmPhone() {
        return lkmPhone;
    }

    public void setLkmPhone(String lkmPhone) {
        this.lkmPhone = lkmPhone;
    }

    @Basic
    @Column(name = "lkm_mobile", nullable = true, length = 16)
    public String getLkmMobile() {
        return lkmMobile;
    }

    public void setLkmMobile(String lkmMobile) {
        this.lkmMobile = lkmMobile;
    }

    @Basic
    @Column(name = "lkm_email", nullable = true, length = 64)
    public String getLkmEmail() {
        return lkmEmail;
    }

    public void setLkmEmail(String lkmEmail) {
        this.lkmEmail = lkmEmail;
    }

    @Basic
    @Column(name = "lkm_position", nullable = true, length = 16)
    public String getLkmPosition() {
        return lkmPosition;
    }

    public void setLkmPosition(String lkmPosition) {
        this.lkmPosition = lkmPosition;
    }

    @Basic
    @Column(name = "lkm_memo", nullable = true, length = 512)
    public String getLkmMemo() {
        return lkmMemo;
    }

    public void setLkmMemo(String lkmMemo) {
        this.lkmMemo = lkmMemo;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        CstLinkman that = (CstLinkman) o;
        return lkmId == that.lkmId &&
                Objects.equals(lkmName, that.lkmName) &&
                Objects.equals(lkmGender, that.lkmGender) &&
                Objects.equals(lkmPhone, that.lkmPhone) &&
                Objects.equals(lkmMobile, that.lkmMobile) &&
                Objects.equals(lkmEmail, that.lkmEmail) &&
                Objects.equals(lkmPosition, that.lkmPosition) &&
                Objects.equals(lkmMemo, that.lkmMemo);
    }

    @Override
    public int hashCode() {

        return Objects.hash(lkmId, lkmName, lkmGender, lkmPhone, lkmMobile, lkmEmail, lkmPosition, lkmMemo);
    }

    @Override
    public String toString() {
        return "CstLinkman{" +
                "lkmId=" + lkmId +
                ", lkmName='" + lkmName + '\'' +
                ", lkmGender='" + lkmGender + '\'' +
                ", lkmPhone='" + lkmPhone + '\'' +
                ", lkmMobile='" + lkmMobile + '\'' +
                ", lkmEmail='" + lkmEmail + '\'' +
                ", lkmPosition='" + lkmPosition + '\'' +
                ", lkmMemo='" + lkmMemo + '\'' +
                '}';
    }
}

使用者和角色(多對多)

使用者:

package domain;

import javax.persistence.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
 * @Author: David.Xiao
 * @Date: 2018/11/14 22:44
 * @Description:
 */
@Entity
@Table(name = "sys_user", schema = "hibernate", catalog = "")
public class SysUser {
    private long userId;
    private String userCode;
    private String userName;
    private String userPassword;
    private String userState;

    //必須在任意一方放棄維護權利
    @ManyToMany(cascade = CascadeType.ALL,mappedBy = "userSet")
    public Set<SysRole> getRoleSet() {
        return roleSet;
    }

    public void setRoleSet(Set<SysRole> roleSet) {
        this.roleSet = roleSet;
    }
    private Set<SysRole> roleSet = new HashSet<>(0);

    @Id
    @Column(name = "user_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    @Basic
    @Column(name = "user_code", nullable = false, length = 32)
    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }

    @Basic
    @Column(name = "user_name", nullable = false, length = 64)
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Basic
    @Column(name = "user_password", nullable = false, length = 32)
    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    @Basic
    @Column(name = "user_state", nullable = false, length = 1)
    public String getUserState() {
        return userState;
    }

    public void setUserState(String userState) {
        this.userState = userState;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SysUser user = (SysUser) o;
        return userId == user.userId &&
                Objects.equals(userCode, user.userCode) &&
                Objects.equals(userName, user.userName) &&
                Objects.equals(userPassword, user.userPassword) &&
                Objects.equals(userState, user.userState);
    }

    @Override
    public int hashCode() {

        return Objects.hash(userId, userCode, userName, userPassword, userState);
    }
}

角色: 

package domain;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
 * @Author: David.Xiao
 * @Date: 2018/11/14 22:44
 * @Description:
 */
@Entity
@Table(name = "sys_role", schema = "hibernate", catalog = "")
public class SysRole {
    private long roleId;
    private String roleName;
    private String roleMemo;

    @ManyToMany(cascade = CascadeType.ALL)
    //加入一張表
    @JoinTable(name = "sys_user_role",   //中間表名
            joinColumns = {@JoinColumn(name = "role_id",referencedColumnName = "role_id")},  //當前實體在中間表的外來鍵欄位
            inverseJoinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "user_id")})  //對方實體在中間表的外來鍵欄位
    public Set<SysUser> getUserSet() {
        return userSet;
    }

    public void setUserSet(Set<SysUser> userSet) {
        this.userSet = userSet;
    }
    private Set<SysUser> userSet = new HashSet<>(0);

    @Id
    @Column(name = "role_id", nullable = false)
/*  可用此方法指定主鍵生成策略為uuid
    //宣告一個主鍵生成器  name:生成器的名字  strategy:hibernate中的主鍵生成策略為uuid
    @GenericGenerator(name = "uid",strategy = "uuid")
    //指定主鍵生成器
    @GeneratedValue(generator = "uid")*/
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getRoleId() {
        return roleId;
    }

    public void setRoleId(long roleId) {
        this.roleId = roleId;
    }

    @Basic
    @Column(name = "role_name", nullable = true, length = 100)
    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    @Basic
    @Column(name = "role_memo", nullable = true, length = 255)
    public String getRoleMemo() {
        return roleMemo;
    }

    public void setRoleMemo(String roleMemo) {
        this.roleMemo = roleMemo;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SysRole role = (SysRole) o;
        return roleId == role.roleId &&
                Objects.equals(roleName, role.roleName) &&
                Objects.equals(roleMemo, role.roleMemo);
    }

    @Override
    public int hashCode() {

        return Objects.hash(roleId, roleName, roleMemo);
    }
}

3.使用hibernate一般要新增log4j日誌配置檔案

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="warn">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

4.JPAUtil類,獲取EntityManager

package dao;

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

/**
 * @Author: David.Xiao
 * @Date: 2018/11/13 20:23
 * @Description:
 */
public class JPAUtil {

    //相當於SessionFactory
    private static EntityManagerFactory factory;

    static {
        factory = Persistence.createEntityManagerFactory("myJPAUnit");
    }

    //獲取操作資料庫的物件
    public static EntityManager createEntityManager()
    {
        return factory.createEntityManager();
    }
}

5.一般的單表CRUD操作

package dao;

import domain.CstCustomer;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;

import java.util.List;

import static org.junit.Assert.*;

/**
 * @Author: David.Xiao
 * @Date: 2018/11/13 21:53
 * @Description: JPA操作資料庫(單表)
 */
public class normalTest {

    @Test
    public void createEntityManager() {
        JPAUtil.createEntityManager();
    }

    /**
     * 儲存
     */
    @Test
    public void save()
    {
        CstCustomer customer = new CstCustomer();
        customer.setCustName("JPA Customer");
        customer.setCustSource("NNU");
        customer.setCustIndustry("HHU");
        customer.setCustLevel("5");
        customer.setCustAddress("佛城西路8號");
        customer.setCustPhone("13813811388");
        //1.獲取EntityManager物件
        EntityManager entityManager = JPAUtil.createEntityManager();
        //2.開啟事務
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        //3.執行儲存操作
        entityManager.persist(customer);
        //4.提交事務
        tx.commit();
        //5.關閉資源
        entityManager.close();
    }

    /**
     * find查詢:立即載入
     * getReference查詢:延遲載入
     */
    @Test
    public void query()
    {
        //1.獲取EntityManager物件
        EntityManager entityManager = JPAUtil.createEntityManager();
        //2.開啟事務
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        //3.執行查詢操作
        CstCustomer customer = entityManager.find(CstCustomer.class,5L);
        System.out.println(customer.toString());
        CstCustomer customer1 = entityManager.getReference(CstCustomer.class,5L);
        System.out.println(customer1.toString());
        //4.提交事務
        tx.commit();
        //5.關閉資源
        entityManager.close();
    }

    /**
     * 查詢所有
     * 使用JPQL查詢,寫法和HQL相似。
     *  將表名換成類名,欄位名換為屬性名
     *  查詢所有時,不能直接用 from 實體類,而要使用select關鍵字: select 別名 from 表名 別名
     */
    @Test
    public void queryByJPQL()
    {
        //1.獲取EntityManager物件
        EntityManager entityManager = JPAUtil.createEntityManager();
        //2.開啟事務
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        //3.執行查詢操作
        Query query = entityManager.createQuery("select c from CstCustomer c");
        Query query1 = entityManager.createQuery("select c from CstCustomer c where custName like ?1 and custLevel like ?2");
        query1.setParameter(1,"%老%");
        query1.setParameter(2,"vip");

        List list = query.getResultList();
        for (Object o:list) {
            System.out.println(o);
        }

        List list1 = query1.getResultList();
        for (Object o:list1) {
            System.out.println(o);
        }

        //4.提交事務
        tx.commit();
        //5.關閉資源
        entityManager.close();
    }

    /**
     * 更新
     */
    @Test
    public void update()
    {
        //1.獲取EntityManager物件
        EntityManager entityManager = JPAUtil.createEntityManager();
        //2.開啟事務
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        //3.執行查詢操作
        CstCustomer customer = entityManager.find(CstCustomer.class,3L);
        System.out.println(customer.toString());
        customer.setCustName("隔壁老王老王");
        //4.提交事務
        tx.commit();
        //5.關閉資源
        entityManager.close();
    }

    /**
     * 更新2
     * 使用合併方法(兩個實體合併或一個實體也能合併)
     */
    @Test
    public void update2()
    {
        //1.獲取EntityManager物件
        EntityManager entityManager = JPAUtil.createEntityManager();
        //2.開啟事務
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        //3.執行查詢操作
        CstCustomer customer = entityManager.find(CstCustomer.class,3L);
        customer.setCustName("隔壁老李老李");
        entityManager.merge(customer);
        //4.提交事務
        tx.commit();
        //5.關閉資源
        entityManager.close();
    }

    /**
     * 刪除
     */
    @Test
    public void delete()
    {
        //1.獲取EntityManager物件
        EntityManager entityManager = JPAUtil.createEntityManager();
        //2.開啟事務
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        //3.執行查詢操作
        CstCustomer customer = entityManager.find(CstCustomer.class,3L);
        entityManager.remove(customer);
        //4.提交事務
        tx.commit();
        //5.關閉資源
        entityManager.close();
    }
}

6.一對多級聯CRUD

package dao;

import domain.CstCustomer;
import domain.CstLinkman;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import static org.junit.Assert.*;

/**
 * @Author: David.Xiao
 * @Date: 2018/11/14 19:47
 * @Description:
 */
public class one2ManyTest {

    @Test
    public void createEntityManager() {

    }

    /**
     * 級聯儲存
     */
    @Test
    public void saveCascade(){
        EntityManager entityManager = JPAUtil.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        CstCustomer customer = new CstCustomer();
        CstLinkman linkman = new CstLinkman();
        customer.setCustName("JPA客戶1");
        linkman.setLkmName("JPA聯絡人1");
        customer.getLinkmanSet().add(linkman);
        linkman.setCustomer(customer);

        entityManager.persist(customer);

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

    /**
     * 查詢與級聯更新
     *
     */
    @Test
    public void updateCascade(){

        EntityManager entityManager = JPAUtil.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        CstLinkman linkman = new CstLinkman();
        linkman.setLkmName("JPA聯絡人1");

        //查詢
        CstCustomer customer = entityManager.find(CstCustomer.class,5L);
        customer.getLinkmanSet().add(linkman);
        linkman.setCustomer(customer);
        entityManager.persist(customer);

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

    /**
     * 級聯刪除
     *
     */
    @Test
    public void removeCascade(){

        EntityManager entityManager = JPAUtil.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        CstCustomer customer = entityManager.find(CstCustomer.class,5L);
        entityManager.remove(customer);
        transaction.commit();
        entityManager.close();
    }
}

7.多對多級聯操作

package dao;

import domain.SysRole;
import domain.SysUser;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import static org.junit.Assert.*;

/**
 * @Author: David.Xiao
 * @Date: 2018/11/14 23:05
 * @Description:
 */
public class many2ManyTest {

    @Test
    public void createEntityManager() {
    }

    @Test
    public void saveMany2Many()
    {
        SysUser user1 = new SysUser();
        SysUser user2 = new SysUser();

        user1.setUserName("多對多使用者1");
        user1.setUserCode("duo1");
        user1.setUserPassword("123");
        user1.setUserState("y");
        user2.setUserName("多對多使用者2");
        user2.setUserCode("duo2");
        user2.setUserPassword("123");
        user2.setUserState("y");

        SysRole role1 = new SysRole();
        SysRole role2 = new SysRole();
        SysRole role3 = new SysRole();

        role1.setRoleName("多對多角色1");
        role2.setRoleName("多對多角色2");
        role3.setRoleName("多對多角色3");

        //建立關係
        user1.getRoleSet().add(role1);
        user1.getRoleSet().add(role2);
        user2.getRoleSet().add(role2);
        user2.getRoleSet().add(role3);

        role1.getUserSet().add(user1);
        role2.getUserSet().add(user1);
        role2.getUserSet().add(user2);
        role3.getUserSet().add(user2);

        EntityManager entityManager = JPAUtil.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //級聯儲存
        entityManager.persist(user1);

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