spring data jpa配置一对多,多对多关系映射

本文介绍了一对多、多对一及多对多关系映射的配置方法,并演示了如何通过Spring Data JPA进行复杂查询及级联操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置一对多关系映射

//配置一对多关系映射
    /**
     *     @OneToMany(targetEntity = LinkMan.class)
     *          targetEntity配置对方的字节码文件
     *     @JoinColumn(name = "lkm_cust_id",referencedColumnName = "cust_id")
     *          name配置外键名称,referencedColumnName配置外键引用主表的主键
     */
    @OneToMany(targetEntity = LinkMan.class)
    @JoinColumn(name = "lkm_cust_id",referencedColumnName = "cust_id")
    private Set<LinkMan> linkMans=new HashSet<LinkMan>();
//配置多对一关系映射
    @ManyToOne(targetEntity = Customer.class)
    @JoinColumn(name = "lkm_cust_id",referencedColumnName = "cust_id")
    private Customer customer;

编写测试类

import com.smx.dao.CustomerDao;
import com.smx.dao.LinkManDao;
import com.smx.domain.Customer;
import com.smx.domain.LinkMan;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
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;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class OneToManyTest {
    @Autowired
    private CustomerDao customerDao;
    @Autowired
    private LinkManDao linkManDao;
    @Test
    @Transactional
    @Rollback(value = false)
    //测试保存操作
    public void addTest(){
        Customer customer=new Customer();
        customer.setCustName("百度");
        LinkMan linkMan=new LinkMan();
        linkMan.setLmkName("张三");

        customer.getLinkMans().add(linkMan);
        linkManDao.save(linkMan);
        customerDao.save(customer);


    }
}

多对多关系映射

用户类

package com.smx.domain;

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

@Entity
@Table(name = "t_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 = "user_age")
    private int age;
//配置多对多映射
    /**
     * @JoinTable配置中间表
     * name中间表名称
     * joinColumns自身对象外键
     * inverseJoinColumns对方外键
     */
    @ManyToMany(targetEntity = Role.class,cascade = {CascadeType.MERGE,CascadeType.PERSIST})
    @JoinTable(
            name = "t_user_role",
            joinColumns = {@JoinColumn(name = "p_user_id",referencedColumnName = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "p_role_id",referencedColumnName = "role_id")}
    )
   //@ManyToMany(mappedBy = "roles")
    private Set<Role> users=new HashSet<Role>();

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

    public void setUsers(Set<Role> users) {
        this.users = users;
    }

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }
}

角色类

package com.smx.domain;

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

@Entity
@Table(name = "t_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 = "t_user_role",
            joinColumns = {@JoinColumn(name = "p_role_id",referencedColumnName = "role_id")},
            inverseJoinColumns = {@JoinColumn(name = "p_user_id",referencedColumnName = "user_id")}
    )*/
   //放弃维护
    @ManyToMany(mappedBy = "users",cascade = {CascadeType.MERGE,CascadeType.PERSIST})
    private Set<User> roles=new HashSet<User>();

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

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

    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;
    }

    @Override
    public String toString() {
        return "Role{" +
                "roleId=" + roleId +
                ", roleName='" + roleName + '\'' +
                '}';
    }
}

UserDao和RoleDao实现spring data jpa 接口规范即可

public interface UserDao extends JpaRepository<User,Long>, JpaSpecificationExecutor<User> {
}

测试类

import com.smx.dao.RoleDao;
import com.smx.dao.UserDao;
import com.smx.domain.Role;
import com.smx.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
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;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TestManyToMany {
    @Autowired
    private UserDao userDao;
    @Autowired
    private RoleDao roleDao;
    @Test
    @Transactional
    @Rollback(false)
    public void testMTM(){
        User user = new User();
        user.setUserName("张三");

        Role role = new Role();
        role.setRoleName("学生");
        //配置用户到角色的关系,可以对中间表数据进行维护
        user.getUsers().add(role);
        //配置角色到用户的关系,可以对中间表数据进行维护   但是两个都存在必须方法一个外键维护
        role.getRoles().add(user);

        userDao.save(user);
    }

}

spring data jpa 复杂查询

需要在接口里面写方法

package com.smx.dao;

import com.smx.domain.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.util.List;

/**
 * 符合spring data jpa接口规范
 *      JpaRepository<操作的实体类类型,主键属性类型>
 *          封装了基本的CRUD
 *      JpaSpecificationExecutor<操作的实体类类型>
 *          封装了复杂类型的查询(分页)
 */
public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {
    /**
     * 根据名称查询
     */
    @Query(value = "from Customer where custName= ? ")
    public Customer findByName(String custName);
    /**
     * 修改方法
     * @Query是查询操作
     * @Modifying更新操作
     */
    @Query(value = "update Customer set custName= ? where id=?")
    @Modifying
    void update(String custName,Long custId);
    /**
     * 使用sql进行查询
     * nativeQuery = true使用sql进行查询
     * nativeQuery = false使用jpql进行查询
     */
    @Query(value = "select * from t_customer ",nativeQuery = true)
    public List<Customer> findSql();

    @Query(value = "select * from t_customer where cust_industry like ?",nativeQuery = true)
    List<Customer> findCustomersByCustIndustry(String industry);
    /**
     * 命名规则定义方法名进行查询
     */
    Customer findByCustName(String custName);
    /**
     * 命名规则定义方法名进行模糊查询
     */
    Customer findByCustNameLike(String custName);
    /**
     * 使用custName模糊查询和所属行业精确查询
     */
    List<Customer> findByCustNameLikeAndCustIndustry(String custName,String industry);
}

级联操作

 @OneToMany(mappedBy = "customer",cascade = {CascadeType.MERGE})

MERGE:更新
PERSIST:保存
REMOVE:删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值