SpringDataJpa复合主键写法

😂 这篇文章最后更新于1451天前,您需要注意相关的内容是否还可用。
目录导航
  • 方式一
  • 方式二
  • 方式一

    复合主键类

    @Embeddable
    public class UserKey implements Serializable {
    
        @Column(name = "NAME", nullable = false, length = 32)
        private String name;
    
        @Column(name = "AGE", nullable = true, length = 32)
        private String age;
        
        getter/setter...
    }

    实体类

    @Entity
    @Table(name = "USER")
    @IdClass(UserKey.class)
    public class User implements Serializable {
    
        /** 
         * serialVersionUID
         */
    	private static final long serialVersionUID = -7768637914227571159L;
    
        /** 
         * 物料编码
         */
    	@Id
    	@Column(name = "NAME", nullable = true, length = 32)
        private String name;
        
        /** 
         * 技术规范书编码
         */
    	@Id
    	@Column(name = "AGE", nullable = true, length = 32)
        private String age;
        getter/setter
        }

    查找方法

    userRepository.findOne(userKey);

    参考:https://www.cnblogs.com/boywwj/p/8031106.html

    方式二

    复合主键不能用@Id,需要用@EmbeddedId

    主键类

    @Embeddable
    public class UserFundPrimarykey implements Serializable {
    	
    	private static final long serialVersionUID = 1L;
     
    	//用户ID
    	private Integer userId;
    	
    	private String date;
    	
    	getter/setter...
    }

    实体类

    @Entity
    @Table(name = "user_funds")
    public class UserFund {
    	
    	/**
    	* 主键
    	* 复合主键不能用@Id,需要用@EmbeddedId。插入数据的时候必须手工赋值
    	*/
    	@EmbeddedId
    	private UserFundPrimarykey userFundPK;
    	
    	//本金
    	@Column(precision=18, scale=5)
    	private BigDecimal principal;
    	
    	//利率(5%传0.05)
    	@Column(precision=18, scale=5)
    	private BigDecimal rate;
    	
    	/**
    	* 当天收益(日利息=本金*利率/365)
    	* 保留2位小数
    	*/
    	@Column(precision=18, scale=2)
    	private BigDecimal interest;
    	
    	getter/setter...
    }

    持久层

    public interface UserFundRepository extends CrudRepository<UserFund, UserFundPrimarykey> {}

    设值使用

    UserFund uf2 = new UserFund();
    //必须手动设置主键
    uf2.setUserFundPK(new UserFundPrimarykey(2, "2017-07-01"));
    uf2.setRate(new BigDecimal("0.041"));
    uf2.setPrincipal(new BigDecimal("20000"));
    //截断,只保留两位小数
    uf2.setInterest(uf2.getRate().multiply(uf2.getPrincipal()).divide(new BigDecimal("365"), 2, RoundingMode.DOWN));
    userFundRepository.save(uf2);

    参考:https://blog.csdn.net/mn960mn/article/details/74034512