JPA进阶-持久化状态

我的博客:欢迎大家访问

JPA进阶

主键生成策略

主键:数据的唯一标识,必须是非空唯一的

JPA主键生成的标准策略有4种:

auto:默认,根据方言自动选择生成策略

identity:mysql的主键自增长策略

sequence:主键的创建效率最高,Oracle的序列对象

table:其他的数据库使用,创建一个表,专门用来存储主键

一般使用默认的生成策略就行了

JPA持久对象的状态

临时状态

在刚用new语句创建,没有和entityManager发生关系

持久化状态(托管状态)

事务开始,和JPA发生关系了,被加入到了一级缓存当中

游离状态(脱管状态)

事务提交之后,但是已经和JPA脱离关系了

扫描二维码关注公众号,回复: 8994849 查看本文章

删除状态:从JPA开始才有

调用了remove()方法,删除对象后,变味了删除状态

脏数据更新

一个持久状态对象在事务管理内,如果改变原来的数据(非主键),此时出现脏数据,在事务提交的时候自动发出update语句去修改

Demo

package com.ifueen.sm;

import com.ifueen.util.JPAUtil;
import org.junit.Test;

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

/**
 *
 * 测试持久化状态
 *
 */
public class StateTest {
    @Test
    public void test(){
        EntityManager jpa = JPAUtil.getJpa();
        Student student = new Student();
        student.setName("希区柯克");   //临时状态
        EntityTransaction transaction = jpa.getTransaction();
        transaction.begin();    //事务开启
        jpa.persist(student);   //脱管状态,与JPA发生关系
        transaction.commit();   //事务提交,对象处于游离状态
        jpa.close();

    }

    @Test
    public void test1(){
        EntityManager jpa = JPAUtil.getJpa();

        EntityTransaction transaction = jpa.getTransaction();
        transaction.begin();    //事务开启
        Student student = jpa.find(Student.class, 12L);//脱管状态,与JPA发生关系
        jpa.remove(student);    //删除状态
        transaction.commit();   //事务提交,对象处于游离状态
        jpa.close();

    }

    @Test
    public void test2(){
        EntityManager jpa = JPAUtil.getJpa();

        EntityTransaction transaction = jpa.getTransaction();
        transaction.begin();    //事务开启
        Student student = jpa.find(Student.class, 13L);//脱管状态,与JPA发生关系
        System.out.println(student);
        student.setName("库布里克");    //脏数据更新
        transaction.commit();   //事务提交,对象处于游离状态
        jpa.close();

    }


}

域对象之间关系

域对象之间的关系分为一对一,一对多(多对一),多对多,现主要讲一下多对一的关系

单向多对一关系

说直白点,就是多个学生类可以对应一个老师类

从表Student类

package com.ifueen.sm;

import javax.persistence.*;

@Entity
@Table(name = "t_student")
public class Student {

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)  //懒加载
    private Tearcher tearcher;

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", tearcher=" + tearcher +
                '}';
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Tearcher getTearcher() {
        return tearcher;
    }

    public void setTearcher(Tearcher tearcher) {
        this.tearcher = tearcher;
    }
}

主表Tearch类设计

package com.ifueen.sm;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "t_tearch")
public class Tearcher {
    @Id
    @GeneratedValue
    private Long id;
    private String name;

    public Tearcher() {
    }

    @Override
    public String toString() {
        return "Tearcher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试

package com.ifueen.sm;

import com.ifueen.util.JPAUtil;
import org.junit.Test;

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

public class StudentTest {


    @Test
    public void create(){

        EntityManager jpa = JPAUtil.getJpa();

    }

    @Test
    public void test1(){
        //一方
        Tearcher tearcher = new Tearcher();
        tearcher.setName("高级算法");
        //多方
        Student student = new Student();
        student.setName("山泥若");
        student.setTearcher(tearcher);



        EntityManager jpa = JPAUtil.getJpa();
        EntityTransaction transaction = jpa.getTransaction();
        transaction.begin();
        jpa.persist(student);
        jpa.persist(tearcher);
        transaction.commit();
        jpa.close();
    }

    @Test
    public void test2(){
        //一方
        Tearcher tearcher = new Tearcher();
        tearcher.setName("物理大牛");
        //多方
        Student student = new Student();
        student.setName("牛顿");
        student.setTearcher(tearcher);

        Student student1 = new Student();
        student1.setName("爱因斯坦");
        student1.setTearcher(tearcher);

        Student student2 = new Student();
        student2.setName("霍金");
        student2.setTearcher(tearcher);

        Student student3 = new Student();
        student3.setName("杨振宁");
        student3.setTearcher(tearcher);

        EntityManager jpa = JPAUtil.getJpa();
        EntityTransaction transaction = jpa.getTransaction();
        transaction.begin();
        jpa.persist(tearcher);
        jpa.persist(student);
        jpa.persist(student1);
        jpa.persist(student2);
        jpa.persist(student3);
        transaction.commit();
        jpa.close();
    }

    @Test
    public void test3(){

        EntityManager jpa = JPAUtil.getJpa();
        Student student = jpa.find(Student.class, 3L);
        System.out.println(student.hashCode());
        //懒加载之后
        Tearcher tearcher = student.getTearcher();
        System.out.println(tearcher);
        jpa.close();
    }

}

fetch抓取策略

FetchType.EAGER:fetch的默认值,立即加载

默认情况下,JPA持续性提供程序使用获取类型EAGER:这将要求持续性提供程序运行时必须迫切左外连接获取数据。

FetchType.LAZY:延迟加载

FetchType.LAZY:这将提示持续性提供程序在首次访问数据时并不急于获取数据。

发布了87 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/f2315895270/article/details/101689926