关联映射
一对多(多对一) 双向关联
package com.xingxue.jpa.demo.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Getter
@Setter
/**
* @OneToMany 注解:在一方来描述一对多的关联关系,在该注解上 多了一个 属性 mappedBy.
* mappedBy 属性 : 该属性只有在 one2many 标签 和 one2one many2many 标签中有。
* 该属性描述使用哪个关联属性来维护外键
*
* fetch 属性:建立采用 懒加载,因为在查询多方信息的时候,可以减少sql的数量
*/
@Entity
@Table(name = "t_class")
public class ClassModel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String description;
@OneToMany(mappedBy ="classModel",fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
private Set<StudentModel> studentModels = new HashSet<StudentModel>();
@Override
public String toString() {
return "ClassModel{" +
"id=" + id +
", description='" + description + '\'' +
'}';
}
}
==============================================================
package com.xingxue.jpa.demo.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Getter
@Setter
@Entity
@Table(name = "t_student")
/**
* @ManyToOne:在多方,描述多对一的关联关系。
* cascade 属性:级联操作
* fetch 属性:加载关联实体是否采用 懒加载,默认懒加载
* FetchType.EAGER: 立即加载
* FetchType.LAZY : 懒加载
* optional 属性: 表示的 关联的实体的属性不能为空,默认可以为空
*
*@JoinColumn:定义外键,一般使用它定义外键的名称
*/
public class StudentModel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER,optional = true)
@JoinColumn(name = "cid")
private ClassModel classModel;
@Override
public String toString() {
return "StudentModel{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
多对多的双向关联
package com.xingxue.jpa.demo3.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Getter
@Setter
@Entity
@Table(name = "t_role")
/**
* @ManyToMany 注解:该注解描述 多对多的关联关系。
*
* @JoinTable 注解:描述中间表的信息
* name 属性:指定的中间表的名称
* joinColumns 属性:指定当前实体对应的表主键作为中间表的外键
* inverseJoinColumns 属性: 指定当前实体关联的实体的对应表中的主键作为中间表的外键
*
*/
public class RoleModel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String rname;
@ManyToMany(mappedBy = "roles")
private Set<UserModel> users = new HashSet<UserModel>();
}
================================================================
package com.xingxue.jpa.demo3.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Getter
@Setter
@Entity
@Table(name = "t_user")
public class UserModel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String logname;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "t_user_role",joinColumns = @JoinColumn(name = "userid"),inverseJoinColumns = @JoinColumn(name="rid"))
private Set<RoleModel> roles = new HashSet<RoleModel>();
}
JPA 二级缓存的使用 (使用的 ehcache)
环境搭建看hibernate 二级缓存配置
- 类缓存
@org.hibernate.annotations.Cache(usage=CacheConcurrencyStrategy.READ_WRITE) 该注解标识在 类上,表示当前实体进行类缓存 - 集合缓存
@org.hibernate.annotations.Cache(usage=CacheConcurrencyStrategy.READ_WRITE) 该注解标识在 集合属性上,表示当前进行集合缓存,注意:集合缓存的元素类型对应的实体也需要配置上类缓存 - 查询缓存
entityManager.createQuery("from UserModel").setHint(QueryHints.HINT_CACHEABLE, true).getResultList().get(0);
setHint(QueryHints.HINT_CACHEABLE, true):表示该jpql 查询的数据放入查询缓存中