Spring Data JPA使用复合主键

演示环境

MySQL 5.7

JDK1.8

spring-data-jpa 1.10.4.RELEASE

hibernate 5.1.2.Final

这里演示一个余额宝的例子,一个用户一天一条记录,表示一个用户一天的收益情况。其中,用户ID,日期是复合主键

项目总体结构如下:



下面依次贴出源代码

pom.xml

  1. <project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”  
  2.     xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.   
  5.     <groupId>com.pp.jpa</groupId>  
  6.     <artifactId>springdata-jpa</artifactId>  
  7.     <version>1.0.0</version>  
  8.     <packaging>jar</packaging>  
  9.   
  10.     <name>springdata-jpa</name>  
  11.     <url>http://maven.apache.org</url>  
  12.   
  13.     <properties>  
  14.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  15.         <maven.compiler.source>1.8</maven.compiler.source>  
  16.         <maven.compiler.target>1.8</maven.compiler.target>  
  17.     </properties>  
  18.   
  19.     <dependencies>  
  20.         <dependency>  
  21.             <groupId>mysql</groupId>  
  22.             <artifactId>mysql-connector-java</artifactId>  
  23.             <version>5.1.40</version>  
  24.         </dependency>  
  25.         <dependency>  
  26.             <groupId>org.springframework.data</groupId>  
  27.             <artifactId>spring-data-jpa</artifactId>  
  28.             <version>1.10.4.RELEASE</version>  
  29.         </dependency>  
  30.         <dependency>  
  31.             <groupId>org.hibernate</groupId>  
  32.             <artifactId>hibernate-core</artifactId>  
  33.             <version>5.1.2.Final</version>  
  34.         </dependency>  
  35.         <dependency>  
  36.             <groupId>org.hibernate</groupId>  
  37.             <artifactId>hibernate-entitymanager</artifactId>  
  38.             <version>5.1.2.Final</version>  
  39.         </dependency>  
  40.         <dependency>  
  41.             <groupId>junit</groupId>  
  42.             <artifactId>junit</artifactId>  
  43.             <version>4.12</version>  
  44.             <scope>test</scope>  
  45.         </dependency>  
  46.     </dependencies>  
  47.   
  48. </project>  
<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>com.pp.jpa</groupId>
    <artifactId>springdata-jpa</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>springdata-jpa</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.10.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.1.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.1.2.Final</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

下面依次是Java源码

  1. package com.pp.jpa.config;  
  2.   
  3. import javax.persistence.EntityManagerFactory;  
  4. import javax.sql.DataSource;  
  5.   
  6. import org.springframework.context.annotation.Bean;  
  7. import org.springframework.context.annotation.Configuration;  
  8. import org.springframework.orm.jpa.JpaTransactionManager;  
  9. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;  
  10. import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;  
  11. import org.springframework.transaction.PlatformTransactionManager;  
  12.   
  13. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;  
  14.   
  15. @Configuration  
  16. public class JPAConfiguration {  
  17.   
  18.     @Bean  
  19.     public DataSource createDataSource(){  
  20.         MysqlDataSource ds = new MysqlDataSource();  
  21.         ds.setURL(”jdbc:mysql://127.0.0.1:3306/jpa”);  
  22.         ds.setUser(”root”);  
  23.         ds.setPassword(”admin123”);  
  24.         return ds;  
  25.     }  
  26.       
  27.     @Bean(name=“entityManagerFactory”)  
  28.     public EntityManagerFactory createEntityManagerFactory(DataSource dataSource){  
  29.         LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();  
  30.         entityManagerFactory.setDataSource(dataSource);  
  31.           
  32.         HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();  
  33.         jpaVendorAdapter.setGenerateDdl(true);  
  34.         jpaVendorAdapter.setShowSql(true);  
  35.         entityManagerFactory.setPackagesToScan(”com.pp.jpa.entity”);  
  36.         entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter);  
  37.         entityManagerFactory.afterPropertiesSet();  
  38.         return entityManagerFactory.getObject();  
  39.     }  
  40.       
  41.     @Bean(name=“transactionManager”)  
  42.     public PlatformTransactionManager createPlatformTransactionManager(EntityManagerFactory entityManagerFactory){  
  43.         JpaTransactionManager transactionManager = new JpaTransactionManager();  
  44.         transactionManager.setEntityManagerFactory(entityManagerFactory);  
  45.         return transactionManager;  
  46.     }  
  47. }  
package com.pp.jpa.config;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

@Configuration
public class JPAConfiguration {

    @Bean
    public DataSource createDataSource(){
        MysqlDataSource ds = new MysqlDataSource();
        ds.setURL("jdbc:mysql://127.0.0.1:3306/jpa");
        ds.setUser("root");
        ds.setPassword("admin123");
        return ds;
    }

    @Bean(name="entityManagerFactory")
    public EntityManagerFactory createEntityManagerFactory(DataSource dataSource){
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setDataSource(dataSource);

        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        jpaVendorAdapter.setGenerateDdl(true);
        jpaVendorAdapter.setShowSql(true);
        entityManagerFactory.setPackagesToScan("com.pp.jpa.entity");
        entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter);
        entityManagerFactory.afterPropertiesSet();
        return entityManagerFactory.getObject();
    }

    @Bean(name="transactionManager")
    public PlatformTransactionManager createPlatformTransactionManager(EntityManagerFactory entityManagerFactory){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }
}





  1. package com.pp.jpa.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.persistence.Embeddable;  
  6.   
  7. /** 
  8.  * 主键  
  9.  * 代表复合主键的实体bean需要实现Serializable接口 
  10.  */  
  11. @Embeddable  
  12. public class UserFundPrimarykey implements Serializable {  
  13.       
  14.     private static final long serialVersionUID = 1L;  
  15.   
  16.     //用户ID  
  17.     private Integer userId;  
  18.       
  19.     /** 
  20.      * 日期,格式yyyy-MM-dd 
  21.      */  
  22.     private String date;  
  23.       
  24.     public UserFundPrimarykey() {}  
  25.       
  26.     public UserFundPrimarykey(Integer userId, String date) {  
  27.         this.userId = userId;  
  28.         this.date = date;  
  29.     }  
  30.   
  31.     public Integer getUserId() {  
  32.         return userId;  
  33.     }  
  34.   
  35.     public void setUserId(Integer userId) {  
  36.         this.userId = userId;  
  37.     }  
  38.   
  39.     public String getDate() {  
  40.         return date;  
  41.     }  
  42.   
  43.     public void setDate(String date) {  
  44.         this.date = date;  
  45.     }  
  46.   
  47.     @Override  
  48.     public String toString() {  
  49.         return “UserFundPrimarykey [userId=” + userId + “, date=” + date + “]”;  
  50.     }  
  51. }  
package com.pp.jpa.entity;

import java.io.Serializable;

import javax.persistence.Embeddable;

/**
 * 主键 
 * 代表复合主键的实体bean需要实现Serializable接口
 */
@Embeddable
public class UserFundPrimarykey implements Serializable {

    private static final long serialVersionUID = 1L;

    //用户ID
    private Integer userId;

    /**
     * 日期,格式yyyy-MM-dd
     */
    private String date;

    public UserFundPrimarykey() {}

    public UserFundPrimarykey(Integer userId, String date) {
        this.userId = userId;
        this.date = date;
    }

    public Integer getUserId() {
        return userId;
    }

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

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "UserFundPrimarykey [userId=" + userId + ", date=" + date + "]";
    }
}

  1. package com.pp.jpa.entity;  
  2.   
  3. import java.math.BigDecimal;  
  4.   
  5. import javax.persistence.Column;  
  6. import javax.persistence.EmbeddedId;  
  7. import javax.persistence.Entity;  
  8. import javax.persistence.Table;  
  9.   
  10. /** 
  11.  *  模拟一个余额宝的功能 
  12.  *  一条记录代表一个用户一天的收益信息(本金,利率,利息) 
  13.  */  
  14. @Entity  
  15. @Table(name = “user_funds”)  
  16. public class UserFund {  
  17.       
  18.     /** 
  19.      * 主键 
  20.      * 复合主键不能用@Id,需要用@EmbeddedId。插入数据的时候必须手工赋值 
  21.      */  
  22.     @EmbeddedId  
  23.     private UserFundPrimarykey userFundPK;  
  24.       
  25.     //本金  
  26.     @Column(precision=18, scale=5)  
  27.     private BigDecimal principal;  
  28.       
  29.     //利率(5%传0.05)  
  30.     @Column(precision=18, scale=5)  
  31.     private BigDecimal rate;  
  32.       
  33.     /** 
  34.      * 当天收益(日利息=本金*利率/365) 
  35.      * 保留2位小数 
  36.      */  
  37.     @Column(precision=18, scale=2)  
  38.     private BigDecimal interest;  
  39.   
  40.     public UserFundPrimarykey getUserFundPK() {  
  41.         return userFundPK;  
  42.     }  
  43.   
  44.     public void setUserFundPK(UserFundPrimarykey userFundPK) {  
  45.         this.userFundPK = userFundPK;  
  46.     }  
  47.   
  48.     public BigDecimal getPrincipal() {  
  49.         return principal;  
  50.     }  
  51.   
  52.     public void setPrincipal(BigDecimal principal) {  
  53.         this.principal = principal;  
  54.     }  
  55.   
  56.     public BigDecimal getRate() {  
  57.         return rate;  
  58.     }  
  59.   
  60.     public void setRate(BigDecimal rate) {  
  61.         this.rate = rate;  
  62.     }  
  63.   
  64.     public BigDecimal getInterest() {  
  65.         return interest;  
  66.     }  
  67.   
  68.     public void setInterest(BigDecimal interest) {  
  69.         this.interest = interest;  
  70.     }  
  71.   
  72.     @Override  
  73.     public String toString() {  
  74.         return “UserFund [userFundPK=” + userFundPK + “, principal=” + principal + “, rate=” + rate + “, interest=”  
  75.                 + interest + ”]”;  
  76.     }  
  77. }  
package com.pp.jpa.entity;

import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

/**
 *  模拟一个余额宝的功能
 *  一条记录代表一个用户一天的收益信息(本金,利率,利息)
 */
@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;

    public UserFundPrimarykey getUserFundPK() {
        return userFundPK;
    }

    public void setUserFundPK(UserFundPrimarykey userFundPK) {
        this.userFundPK = userFundPK;
    }

    public BigDecimal getPrincipal() {
        return principal;
    }

    public void setPrincipal(BigDecimal principal) {
        this.principal = principal;
    }

    public BigDecimal getRate() {
        return rate;
    }

    public void setRate(BigDecimal rate) {
        this.rate = rate;
    }

    public BigDecimal getInterest() {
        return interest;
    }

    public void setInterest(BigDecimal interest) {
        this.interest = interest;
    }

    @Override
    public String toString() {
        return "UserFund [userFundPK=" + userFundPK + ", principal=" + principal + ", rate=" + rate + ", interest="
                + interest + "]";
    }
}

  1. package com.pp.repository;  
  2.   
  3. import org.springframework.data.repository.CrudRepository;  
  4.   
  5. import com.pp.jpa.entity.UserFund;  
  6. import com.pp.jpa.entity.UserFundPrimarykey;  
  7.   
  8. public interface UserFundRepository extends CrudRepository<UserFund, UserFundPrimarykey> {  
  9.       
  10. }   
package com.pp.repository;

import org.springframework.data.repository.CrudRepository;

import com.pp.jpa.entity.UserFund;
import com.pp.jpa.entity.UserFundPrimarykey;

public interface UserFundRepository extends CrudRepository<UserFund, UserFundPrimarykey> {

} 

启动类

  1. package com.pp.jpa;  
  2.   
  3. import java.math.BigDecimal;  
  4. import java.math.RoundingMode;  
  5.   
  6. import org.springframework.context.annotation.AnnotationConfigApplicationContext;  
  7. import org.springframework.context.annotation.ComponentScan;  
  8. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;  
  9. import org.springframework.transaction.annotation.EnableTransactionManagement;  
  10.   
  11. import com.pp.jpa.entity.UserFund;  
  12. import com.pp.jpa.entity.UserFundPrimarykey;  
  13. import com.pp.repository.UserFundRepository;  
  14.   
  15. @ComponentScan  
  16. @EnableJpaRepositories(value=“com.pp”)  
  17. @EnableTransactionManagement  
  18. public class App {  
  19.     public static void main(String[] args) throws Exception {  
  20.         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(App.class);  
  21.           
  22.         UserFund uf1 = new UserFund();  
  23.         //必须手动设置主键  
  24.         uf1.setUserFundPK(new UserFundPrimarykey(1“2017-07-01”));  
  25.         uf1.setRate(new BigDecimal(“0.041”));  
  26.         uf1.setPrincipal(new BigDecimal(“10000”));  
  27.         //截断,只保留两位小数  
  28.         uf1.setInterest(uf1.getRate().multiply(uf1.getPrincipal()).divide(new BigDecimal(“365”), 2, RoundingMode.DOWN));  
  29.           
  30.         UserFund uf2 = new UserFund();  
  31.         //必须手动设置主键  
  32.         uf2.setUserFundPK(new UserFundPrimarykey(2“2017-07-01”));  
  33.         uf2.setRate(new BigDecimal(“0.041”));  
  34.         uf2.setPrincipal(new BigDecimal(“20000”));  
  35.         //截断,只保留两位小数  
  36.         uf2.setInterest(uf2.getRate().multiply(uf2.getPrincipal()).divide(new BigDecimal(“365”), 2, RoundingMode.DOWN));  
  37.           
  38.         UserFundRepository ur = context.getBean(UserFundRepository.class);  
  39.         ur.save(uf1);  
  40.         ur.save(uf2);  
  41.           
  42.         ur.findAll().forEach(System.out::println);  
  43.           
  44.         //查询用户ID=2,在2017-07-01这一天的收益  
  45.         System.out.println(ur.findOne(new UserFundPrimarykey(2“2017-07-01”)));  
  46.         context.close();  
  47.     }  
  48. }  
package com.pp.jpa;

import java.math.BigDecimal;
import java.math.RoundingMode;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.pp.jpa.entity.UserFund;
import com.pp.jpa.entity.UserFundPrimarykey;
import com.pp.repository.UserFundRepository;

@ComponentScan
@EnableJpaRepositories(value="com.pp")
@EnableTransactionManagement
public class App {
    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(App.class);

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

        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 ur = context.getBean(UserFundRepository.class);
        ur.save(uf1);
        ur.save(uf2);

        ur.findAll().forEach(System.out::println);

        //查询用户ID=2,在2017-07-01这一天的收益
        System.out.println(ur.findOne(new UserFundPrimarykey(2, "2017-07-01")));
        context.close();
    }
}

一些注意事项和做法已经在备注中有写,大家模仿着写就OK了


直接运行main方法,控制台输出如下信息

  1. Hibernate: select userfund0_.date as date1_0_0_, userfund0_.userId as userId2_0_0_, userfund0_.interest as interest3_0_0_, userfund0_.principal as principa4_0_0_, userfund0_.rate as rate5_0_0_ from user_funds userfund0_ where userfund0_.date=? and userfund0_.userId=?  
  2. Hibernate: insert into user_funds (interest, principal, rate, date, userId) values (?, ?, ?, ?, ?)  
  3. Hibernate: select userfund0_.date as date1_0_0_, userfund0_.userId as userId2_0_0_, userfund0_.interest as interest3_0_0_, userfund0_.principal as principa4_0_0_, userfund0_.rate as rate5_0_0_ from user_funds userfund0_ where userfund0_.date=? and userfund0_.userId=?  
  4. Hibernate: insert into user_funds (interest, principal, rate, date, userId) values (?, ?, ?, ?, ?)  
  5. Hibernate: select userfund0_.date as date1_0_, userfund0_.userId as userId2_0_, userfund0_.interest as interest3_0_, userfund0_.principal as principa4_0_, userfund0_.rate as rate5_0_ from user_funds userfund0_  
  6. UserFund [userFundPK=UserFundPrimarykey [userId=1, date=2017-07-01], principal=10000.00000, rate=0.04100, interest=1.12]  
  7. UserFund [userFundPK=UserFundPrimarykey [userId=2, date=2017-07-01], principal=20000.00000, rate=0.04100, interest=2.24]  
  8. Hibernate: select userfund0_.date as date1_0_0_, userfund0_.userId as userId2_0_0_, userfund0_.interest as interest3_0_0_, userfund0_.principal as principa4_0_0_, userfund0_.rate as rate5_0_0_ from user_funds userfund0_ where userfund0_.date=? and userfund0_.userId=?  
  9. UserFund [userFundPK=UserFundPrimarykey [userId=2, date=2017-07-01], principal=20000.00000, rate=0.04100, interest=2.24]  
Hibernate: select userfund0_.date as date1_0_0_, userfund0_.userId as userId2_0_0_, userfund0_.interest as interest3_0_0_, userfund0_.principal as principa4_0_0_, userfund0_.rate as rate5_0_0_ from user_funds userfund0_ where userfund0_.date=? and userfund0_.userId=?
Hibernate: insert into user_funds (interest, principal, rate, date, userId) values (?, ?, ?, ?, ?)
Hibernate: select userfund0_.date as date1_0_0_, userfund0_.userId as userId2_0_0_, userfund0_.interest as interest3_0_0_, userfund0_.principal as principa4_0_0_, userfund0_.rate as rate5_0_0_ from user_funds userfund0_ where userfund0_.date=? and userfund0_.userId=?
Hibernate: insert into user_funds (interest, principal, rate, date, userId) values (?, ?, ?, ?, ?)
Hibernate: select userfund0_.date as date1_0_, userfund0_.userId as userId2_0_, userfund0_.interest as interest3_0_, userfund0_.principal as principa4_0_, userfund0_.rate as rate5_0_ from user_funds userfund0_
UserFund [userFundPK=UserFundPrimarykey [userId=1, date=2017-07-01], principal=10000.00000, rate=0.04100, interest=1.12]
UserFund [userFundPK=UserFundPrimarykey [userId=2, date=2017-07-01], principal=20000.00000, rate=0.04100, interest=2.24]
Hibernate: select userfund0_.date as date1_0_0_, userfund0_.userId as userId2_0_0_, userfund0_.interest as interest3_0_0_, userfund0_.principal as principa4_0_0_, userfund0_.rate as rate5_0_0_ from user_funds userfund0_ where userfund0_.date=? and userfund0_.userId=?
UserFund [userFundPK=UserFundPrimarykey [userId=2, date=2017-07-01], principal=20000.00000, rate=0.04100, interest=2.24]

查询数据库

select ** from user_funds;


原文地址:http://blog.csdn.net/mn960mn/article/details/74034512

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值