pom.xml:
<?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>cn.dy</groupId>
<artifactId>springJpaManyToMany</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<c3p0.version>0.9.1.2</c3p0.version>
<mysql.version>5.1.6</mysql.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring start-->
<!--spring aop-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring aop-->
<!--spring ioc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>


<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring ioc-->
<!--spring end-->
<!--spring 对orm框架的支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring 对orm框架的支持包-->
<!--hibernate start-->
<!--hibernate 核心包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!--hibernate 对JPA实现的包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!--hibernate 验证包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.1.Final</version>
</dependency>
<!--hibernate end-->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>

<!--mysql的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--spring dataJpa 的坐标-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.9.0.RELEASE</version>
</dependency>
<!--spring 测试 的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- el 标签 的坐标-->
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.4</version>
</dependency>
<!-- el 标签 的坐标-->
</dependencies>

</project>


resources:
  applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"

xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<!--1 创建数据库的连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="password" value="root"/>
<property name="user" value="root"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_data?characterEncoding=utf-8"/>
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
</bean>
<!--2 工厂类对象-->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!--数据源-->
<property name="dataSource" ref="dataSource"/>
<!--实体类的扫描器-->
<property name="packagesToScan" value="cn.dy.jpa.entity"/>
<!--jpa配置供应商的适配器-->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- 指定数据库类型-->
<property name="database" value="MYSQL"/>
<!-- 是否自动创建数据库表-->
<property name="generateDdl" value="true"/>
<!-- 数据库方言 支持的特有语法-->
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
<!--是否向控制台输出语句 update hibernate.hbm2ddl.auto-->
<property name="showSql" value="true"/>

</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!--配置事物-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!--一般出现在sevice层 start-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--aop-->
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* cn.dy.jpa.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
<!--一般出现在sevice层 end-->

<!-- <context:component-scanspring base-package="cn.dy.jpa"></context:component-scan>-->
<!-- spring dataJpa 整合 dao-->
<jpa:repositories base-package="cn.dy.jpa.dao"
transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory"/>

</beans>
entity:
  SysUser主表:
package cn.dy.jpa.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
* author:dingyi
* time:2019/8/21 0021 10:02
*/
@Entity
@Table(name = "sys_user")
public class SysUser implements Serializable {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name="user_id")
private long userId;
@Column(name="username")
private String username;
@Column(name="password")
private String password;
/**
* 配置用户到角色的多对多关系
* 配置多对多的映射关系
* 1.声明表关系的配置
* @ManyToMany(targetEntity = SysRole.class,cascade = CascadeType.ALL) //多对多
* targetEntity:代表对方的实体类字节码
* 2.配置中间表(包含两个外键)
* @JoinTable
* name : 中间表的名称
* joinColumns:配置当前对象在中间表的外键
* @JoinColumn的数组
* name:外键名
* referencedColumnName:参照的主表的主键名
* inverseJoinColumns:配置对方对象在中间表的外键
*/
@ManyToMany(targetEntity = SysRole.class,cascade = CascadeType.ALL)
@JoinTable(name = "sys_user_role",
// joinColumns 当前表在中间表中的外键 参照当前表的主键字段
joinColumns = {@JoinColumn(name = "userid", referencedColumnName = "user_id")},

// inverseJoinColumns 对方对象在中间表 的外键 参照当前表的主键字段
inverseJoinColumns = {@JoinColumn( name = "roleid", referencedColumnName = "role_id")}

)
private Set<SysRole> roles = new HashSet<>();

public long getUserId() {
return userId;
}

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

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public Set<SysRole> getRoles() {
return roles;
}

public void setRoles(Set<SysRole> roles) {
this.roles = roles;
}

@Override
public String toString() {
return "SysUser{" +
"userId=" + userId +
", username='" + username + '\'' +
", password='" + password + '\'' +

'}';
}
}
SysRole从表:
package cn.dy.jpa.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
* author:dingyi
* time:2019/8/21 0021 10:02
*/
@Entity
@Table(name = "sys_role")
public class SysRole implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="role_id")
private long roleId;
@Column(name="role_name")
private String rolename;
@Column(name="memo")
private String memo;

@ManyToMany(mappedBy = "roles",fetch = FetchType.LAZY)//放弃维护权
private Set<SysUser> users = new HashSet<>();

@Override
public String toString() {
return "SysRole{" +
"roleId=" + roleId +
", rolename='" + rolename + '\'' +
", memo='" + memo + '\'' +

'}';
}

public long getRoleId() {
return roleId;
}

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

public String getRolename() {
return rolename;
}

public void setRolename(String rolename) {
this.rolename = rolename;
}

public String getMemo() {
return memo;
}

public void setMemo(String memo) {
this.memo = memo;
}

public Set<SysUser> getUsers() {
return users;
}

public void setUsers(Set<SysUser> users) {
this.users = users;
}
}
dao层:
  userdao:
package cn.dy.jpa.dao;

import cn.dy.jpa.entity.SysUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

/**
* author:dingyi
* time:2019/8/21 0021 10:03
*/
public interface SysUserDao extends JpaRepository<SysUser,Long>, JpaSpecificationExecutor<SysUser> {
}
roledao:
package cn.dy.jpa.dao;

import cn.dy.jpa.entity.SysRole;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

/**
* author:dingyi
* time:2019/8/21 0021 10:04
*/
public interface SysRoleDao extends JpaRepository<SysRole,Long>, JpaSpecificationExecutor<SysRole> {
}
test类:
import cn.dy.jpa.dao.SysRoleDao;
import cn.dy.jpa.dao.SysUserDao;
import cn.dy.jpa.entity.SysRole;
import cn.dy.jpa.entity.SysUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Commit;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

/**
* author:dingyi
* time:2019/8/21 0021 11:52
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class testManyToMany {
@Autowired
SysUserDao userDao;
@Autowired
SysRoleDao roleDao;
@Test
@Transactional
@Commit
public void addUserAndRole(){
// 1创建用户
SysUser sysUser = new SysUser();
sysUser.setUsername("admin");
sysUser.setPassword("123456");
// 2创建 角色
SysRole sysRole = new SysRole();
sysRole.setRolename("管理员");
sysRole.setMemo("权限");
// 3 配置用户和角色之间的关系
sysUser.getRoles().add(sysRole);
sysRole.getUsers().add(sysUser);
//4 把用户角色写入数据可
userDao.save(sysUser);
//roleDao.save(sysRole); //无需再写
}

@Test
@Transactional
@Commit
public void addUserAndRole1(){
// 1创建用户
SysUser user = new SysUser();
user.setUsername("林志玲");
user.setPassword("123456");
SysUser user1 = new SysUser();
user1.setUsername("杨幂");
user1.setPassword("123456");
// 2创建 角色
SysRole role = new SysRole();
role.setRolename("演员");
SysRole rol = new SysRole();
rol.setRolename("女主脚");
// 3 配置用户和角色之间的关系
user.getRoles().add(role);
user.getRoles().add(rol);

user1.getRoles().add(rol);
user1.getRoles().add(role);

role.getUsers().add(user);
role.getUsers().add(user1);
rol.getUsers().add(user);

rol.getUsers().add(user1);
//4 把用户角色写入数据可
userDao.save(user);
userDao.save(user1);
}
/**
* 删除操作
* 在多对多的删除时,双向级联删除根本不能配置
* 禁用
* 如果配了的话,如果数据之间有相互引用关系,可能会清空所有数据
*/
@Test
@Transactional
@Commit
@Rollback(false)
public void removeUserAndRole(){

userDao.delete(1L);
userDao.delete(2L);

}
}


 posted on 2019-08-31 16:45  来呀~快活啊  阅读(541)  评论(0编辑  收藏  举报