import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
/**
* 多对多的配置
* @author 帅哥
*
*/
@Entity //指明当前是个实体类
@Table(name="user") //对应数据库中的表名
public class User implements Serializable{
@Id //主键
@Column(name="uid") //对应数据库的表中的字段名
@GenericGenerator(name="mynative",strategy="native") //这个是hibernate中提供的外键生成策略。
@GeneratedValue(generator="mynative")//generator中引入上面的name值
private Integer uid;
@Column(name="cname") //对应数据库的表中的字段名,名称相同时,也可以省略
private String uname;
//user没有放弃外键维护,所以需要配置中间表
@ManyToMany(targetEntity=Role.class,cascade={CascadeType.PERSIST})
//name中间表的名字,joinColumns和用户表做主外键关联
//inverseJoinColumn 和角色表做主外键关联
@JoinTable(name="user_role",joinColumns={@JoinColumn(name="uid",referencedColumnName="uid")},
inverseJoinColumns={@JoinColumn(name="rid",referencedColumnName="rid")})
private Set roles=new HashSet<>();
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
}
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity //指明当前是个实体类
@Table(name="role") //对应数据库中的表名
public class Role implements Serializable{
@Id //主键
@Column(name="rid") //对应数据库的表中的字段名
@GenericGenerator(name="mynative",strategy="native") //这个是hibernate中提供的外键生成策略。
@GeneratedValue(generator="mynative")//generator中引入上面的name值
private Integer rid;
@Column(name="rname") //对应数据库的表中的字段名,名称相同时,也可以省略
private String rname;
//role放弃外键维护
@ManyToMany(targetEntity=User.class,mappedBy="roles")
private Set users=new HashSet<>();
public Integer getRid() {
return rid;
}
public void setRid(Integer rid) {
this.rid = rid;
}
public String getRname() {
return rname;
}
public void setRname(String rname) {
this.rname = rname;
}
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
}
org.hibernate.jpa.HibernatePersistenceProvider
com.haha.domain.User
(4)、编写一个工具类,用于获取JPA的操作数据库对象
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
//JPA的工具类
public class JpaUtils {
private static EntityManagerFactory em;
static{
em=Persistence.createEntityManagerFactory("myPersistUnit");
}
public static EntityManager createEntityManager(){
return em.createEntityManager();
}
}
(5)、编写一个测试类
import org.junit.Test;
import com.haha.domain.Role;
import com.haha.domain.User;
import com.haha.utils.JpaUtils;
public class demo2 {
/**
* 级联保存
*/
@Test
public void run1(){
EntityManager manager = JpaUtils.createEntityManager();
EntityTransaction tx = manager.getTransaction();
//开启事务
tx.begin();
//增删改查操作
User u1=new User();
u1.setUname("哈哈");
User u2=new User();
u2.setUname("嘿嘿");
Role r1=new Role();
r1.setRname("歌手");
Role r2=new Role();
r2.setRname("ceo");
Role r3=new Role();
r3.setRname("演员");
//级联保存,外键维护
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r3);
u2.getRoles().add(r1);
r1.getUsers().add(u1);
r1.getUsers().add(u2);
r2.getUsers().add(u1);
r3.getUsers().add(u2);
manager.persist(u1);
manager.persist(u2);
//提交事务
tx.commit();
}
}
@Entity
作用:指定当前类是实体类。写上此注解用于在创建SessionFactory时,加载映射配置。
@Table
作用:指定实体类和表之间的对应关系。
属性:
name:指定数据库表的名称
@Id
作用:指定当前字段是主键。
@GeneratedValue
作用:指定主键的生成方式。JPA的主键生成方式详解见2.4小节的说明。
属性:
strategy :指定主键生成策略。JPA支持四种生成策略,具体介绍看2.4小节。
@Column
作用:指定实体类属性和数据库表之间的对应关系
属性:
name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
columnDefinition: 定义建表时创建此列的DDL
secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字
作用:建立一对多的关系映射
属性:
targetEntityClass:指定多的多方的类的字节码
mappedBy:指定从表实体类中引用主表对象的名称。
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
orphanRemoval:是否使用孤儿删除
@ManyToOne
作用:建立多对一的关系
属性:
targetEntityClass:指定一的一方实体类字节码
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
optional:关联是否可选。如果设置为false,则必须始终存在非空关系。
@JoinColumn
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称
referencedColumnName:指定引用主表的主键字段名称
unique:是否唯一。默认值不唯一
nullable:是否允许为空。默认值允许。
insertable:是否允许插入。默认值允许。
updatable:是否允许更新。默认值允许。
columnDefinition:列的定义信息。
@ManyToMany
作用:用于映射多对多关系
属性:
cascade:配置级联操作。
fetch:配置是否采用延迟加载。
targetEntity:配置目标的实体类。映射多对多的时候不用写。
@JoinTable
作用:针对中间表的配置
属性:
name:配置中间表的名称
joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段
inverseJoinColumn:中间表的外键字段关联对方表的主键字段