主要的结构目录:
创建Role.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package cn.itcast.domain; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Entity @Table (name = "sys_role" ) public class Role { @Id @GeneratedValue (strategy = GenerationType.IDENTITY) @Column (name = "role_id" ) private Long roleId; @Column (name = "role_name" ) private String roleName; /** *配置多对多 */ @ManyToMany (targetEntity = User. class ) //配置多表关系 @JoinTable (name= "sys_user_role" //joinColumns,当前对象在中间表的外键 ,joinColumns = { @JoinColumn (name = "sys_role_id" ,referencedColumnName = "role_id" )} //inverseJoinColumns,对方对象在中间表的外键 ,inverseJoinColumns = { @JoinColumn (name = "sys_user_id" ,referencedColumnName = "user_id" )}) private Set<User> users= new HashSet<User>(); 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 Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this .users = users; } } |
主要的User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | package cn.itcast.domain; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Entity @Table (name = "sys_user" ) public class User { @Id @GeneratedValue (strategy = GenerationType.IDENTITY) @Column (name = "user_id" ) private Long userId; @Column (name = "user_name" ) private String userName; @Column (name = "age" ) private Integer age; /** *配置用户到角色的多对多关系 * 配置多对多的映射关系 * 1.声明表关系的配置 * @ManyToMany(targetEntity = Role.class) * targetEntity:代表对方的实体类字节码 * 2、配置中间表(包含两个外键) * name:中间表的名称 * joinColumns,当前对象在中间表的外键 * name:外键名 * referencedColumnName:参照的主表的主键名 * inverseJoinColumns,对方对象在中间表的外键 * name:外键名 * referencedColumnName: */ @ManyToMany (targetEntity = Role. class ,cascade = CascadeType.ALL) @JoinTable (name= "sys_user_role" //joinColumns,当前对象在中间表的外键 ,joinColumns = { @JoinColumn (name = "sys_user_id" ,referencedColumnName = "user_id" )} //inverseJoinColumns,对方对象在中间表的外键 ,inverseJoinColumns = { @JoinColumn (name = "sys_role_id" ,referencedColumnName = "role_id" )}) private Set<Role> roles= new HashSet<Role>(); 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 Integer getAge() { return age; } public void setAge(Integer age) { this .age = age; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this .roles = roles; } } |
主要的RoleDao.java
1 2 | public interface RoleDao extends JpaRepository<Role,Long>,JpaSpecificationExecutor<Role> { } |
主要的UserDao.java
1 2 | public interface UserDao extends JpaRepository<User,Long>,JpaSpecificationExecutor<User> { } |
在配置applicationContext.xml中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | <?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"> <!--spring 和 spring data jpa的配置--> <!-- 1 .创建entityManagerFactory对象交给spring容器管理--> <bean id= "entityManagerFactoty" class = "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > <property name= "dataSource" ref= "dataSource" /> <!--配置的扫描的包(实体类所在的包) --> <property name= "packagesToScan" value= "cn.itcast.domain" /> <!-- jpa的实现厂家 --> <property name= "persistenceProvider" > <bean class = "org.hibernate.jpa.HibernatePersistenceProvider" /> </property> <!--jpa的供应商适配器 --> <property name= "jpaVendorAdapter" > <bean class = "org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" > <!--配置是否自动创建数据库表 --> <property name= "generateDdl" value= "false" /> <!--指定数据库类型 --> <property name= "database" value= "MYSQL" /> <!--数据库方言:支持的特有语法 --> <property name= "databasePlatform" value= "org.hibernate.dialect.MySQLDialect" /> <!--是否显示sql --> <property name= "showSql" value= "true" /> </bean> </property> <!--jpa的方言 :高级的特性 --> <property name= "jpaDialect" > <bean class = "org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> </property> <!--注入jpa的配置信息 加载jpa的基本配置信息和jpa实现方式(hibernate)的配置信息 hibernate.hbm2ddl.auto : 自动创建数据库表 create : 每次都会重新创建数据库表 update:有表不会重新创建,没有表会重新创建表 --> <property name= "jpaProperties" > <props> <prop key= "hibernate.hbm2ddl.auto" >update</prop> </props> </property> </bean> <!-- 2 .创建数据库连接池 --> <bean id= "dataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" > <property name= "user" value= "root" ></property> <property name= "password" value= "root" ></property> <property name= "jdbcUrl" value= "jdbc:mysql:///jpa" ></property> <property name= "driverClass" value= "com.mysql.jdbc.Driver" ></property> </bean> <!-- 3 .整合spring dataJpa--> <jpa:repositories base- package = "cn.itcast.dao" transaction-manager-ref= "transactionManager" entity-manager-factory-ref= "entityManagerFactoty" ></jpa:repositories> <!-- 4 .配置事务管理器 --> <bean id= "transactionManager" class = "org.springframework.orm.jpa.JpaTransactionManager" > <property name= "entityManagerFactory" ref= "entityManagerFactoty" ></property> </bean> <!-- 4 .txAdvice--> <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> <!-- 5 .aop--> <aop:config> <aop:pointcut id= "pointcut" expression= "execution(* cn.itcast.service.*.*(..))" /> <aop:advisor advice-ref= "txAdvice" pointcut-ref= "pointcut" /> </aop:config> <!-- 5 .声明式事务 --> <!-- 6 . 配置包扫描--> <context:component-scan base- package = "cn.itcast" ></context:component-scan> </beans> |
保存一个用户,保存一个角色
主要的applicationContext.xml中
1 2 3 4 5 | <property name= "jpaProperties" > <props> <prop key= "hibernate.hbm2ddl.auto" >create</prop> </props> </property> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Test @Transactional @Rollback ( false ) public void testAdd(){ User user = new User(); user.setUserName( "小李" ); Role role = new Role(); role.setRoleName( "java程序员" ); user.getRoles().add(role); userDao.save(user); roleDao.save(role); } |
测试中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //测试级联添加 @Test @Transactional @Rollback ( false ) public void testCadeAdd(){ User user = new User(); user.setUserName( "小李" ); Role role = new Role(); role.setRoleName( "java程序员" ); user.getRoles().add(role); userDao.save(user); //roleDao.save(role); } //测试级联删除 @Test @Transactional @Rollback ( false ) public void testCadeRemove(){ //查询1号用户 User user = userDao.findOne(1l); //删除1号用户 userDao.delete(user); } |
在测试中主要spring配置中的问题,主要是配置中不能出问题。在这些中主要调用的是接口中继承的两个类,所以前面也介绍了继承的两个类中的方法
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步