JPA进阶_day02

新鲜速递:Spring Data JPA 3.0快速入门、进阶到精通 随着Spring Boot 3.0的发布,Spring Data JPA 3.0也逐渐走入大家的视野,本文将由浅入深的传授如何快速入门和使用Spring Data JPA。 阅读详情

1 JPA主键生成策略

1.1 主键介绍

含义:主键是关系数据库中的一个基本概念,它用来保证记录的唯一性。简单来说,就是同一张数据库表中,不允许存在多条相同主键的记录。
特点:非空且唯一
主键分类:

  1. 自然主键 具有实际意义的列来作为主键
  2. 代理主键 没有实际意义的列来作为主键

1.2 JPA标准策略有4种:

  1. auto策略
    根据数据库方言来选择的到底使用哪种策略
  2. table策略
    表的生成策略 额外创建一张表来维护主键
  3. sequence策略
    序列策略
  4. identity策略
    自增策略

2 JPA的状态

2.1 JPA状态的含义

一个实体交个JPA维护的时候 这个实体在不同的时期 状态也就不一样

  1. 临时状态(transient):瞬时状态 :
    刚刚创建出来 还没有和JPA发生关系
  2. 持久化状态(persistent):托管状态:
    这个实体对象已经和JPA发生关系
  3. 游离状态(detached):脱管状态:
    脱离entityManager 已经被持久化 不存在entityManager中
  4. 3.5.删除状态(removed):从JPA才开始有的状态:
    即将删除的时候

2.2 脏数据更新

一个持久状态对象在事务管理内,如果改变原来的数据(非主键),此时出现脏数据,在事务提交的时候自动发出update语句去修改

@Test
public void update() throws Exception {
  save();

  EntityManager entityManager = JPAUtils.getEntityManager();
  entityManager.getTransaction().begin();
  
  StateDomain stateDomain = entityManager.find(StateDomain.class, 1L);// 持久状态
  stateDomain.setName("stateDomain");
  // 写不写效果是一样
  entityManager.merge(stateDomain);// 持久状态

  entityManager.getTransaction().commit();
  entityManager.close();// 游离状态
}
2.2.1 执行流程分析

第一步:
拿到entityManager,开启事务
第二步:
通过entityManager拿到一个对象,那么现在这个对象就是持久化的对象
这个对象会放到一级缓存里面
JPA会为当前这个对象准备一个快照(把这个对象进行了备份)
第三步:提交事务
它会把快照 与 你现在这个对象的数据进行对比
如果相同,就不需要修改,也不会发送SQL(性能就高了)
当不相同的时候,JPA就会认为现在这个数据是脏数据
脏数据它就会在事务提交的时候,把它进行数据库的同步(发送update SQL语句)

2.3 n-to-n 问题

持久状态的对象是不能修改OID(不能修改主键)
报错信息:
org.hibernate.HibernateException: identifier of an instance of cn.itsource.jpa.state.StateDomain was altered from 1 to 200

2.4 持久对象(domain层)定义规则

  1. 类不能定义为final类,否则会延迟加载收到影响
  2. 所有属性的类型都必须是包装类型,因为JPA内部代码很多判断都是基于是否等于null,不能是8个基本类型(int,byte,short,long,char,boolean,float,double)
  3. 必须有默认无参构造方法,因为find方法获取的时候会在内存实例化domain对象

entityManager的方法改变持久对象的状态

在这里插入图片描述

3 域对象之间的关系在这里插入图片描述

3.1 域对象之间的关系

对象和对象之间 存在一定的关系

依赖关系:
一般指controll,service,dao层之间的关系
Controller表现层依赖于Service业务层,Service依赖于Dao持久层

关联关系:
关联按照多重性可分为一对一、一对多、多对一和多对多。 主要指的数据库(类)的关系
按照导航性可分为单向关联和双向关联
注意:
不管理一对多,还是多对多(不管它们是双向还是单向),数据库的结构不变(多方有外键)
多对多:必有一张中间表
一对一:设计方案(共享主键,唯一外键),主从关系

聚合关系(本质还是双向多对一,一对多)
整体和部分关系,整体和部分可以分开存在

组合关系(特殊一对多)
强聚合关系,整体和部分之间不能分开

3.2 单向多对一

3.2.1 基本配置

Product 类

@Entity
@Table(name = "t_product")
@Cacheable(true)
public class Product {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dir_id")//指定外键名称
    private ProductDir dir;
    get/set方法
}

ProductDir类

@Entity
@Table(name = "t_productDir")
public class ProductDir {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
     get/set方法
}
3.2.2 添加数据保存

性能差写法:先保存多方,再保存一方
正确写法:先保存一方,再保存多方

@Test
public void testName()throws Exception{
	  //两个产品  一个分类
	  Product product = new Product();
	  product.setName("旺仔小馒头");
	  Product product1 = new Product();
	  product1.setName("大馒头");
	  ProductDir dir = new ProductDir();
	  dir.setName("食品");
	  product.setDir(dir);
	  product1.setDir(dir);
	  EntityManager entityManager = JUnit.getEntityManager();
	  entityManager.getTransaction().begin();
	  entityManager.persist(dir);
	  entityManager.persist(product);
	  entityManager.persist(product1);
	  entityManager.getTransaction().commit();
	  entityManager.close();
}

3.3 fetch抓取策略

抓取策略就是告诉JPA怎样发出sql获取关联对象
抓取策略配置:
@ManyToOne(fetch = FetchType.LAZY )表示懒加载 – 需要使用的时候,才发送sql查询
@ManyToOne(fetch = FetchType.EAGER) 表示迫切加载 – 不使用都把数据加载出来 发送左外连接查询数据

@Test
public void get() throws Exception {
	  EntityManager entityManager = JPAUtils.getEntityManager();
	  Product product = (Product) entityManager.find(Product.class, 1L);
	  System.out.println(product);
	  System.out.println("多方的外键==一方主键:" + product.getDir().getId());
	  // 延迟加载
	  // 通过javassist-3.18.1-GA.jar代理模式:ProductDir_$$_jvst960_1代理对象
	  System.out.println("一方的class:" + product.getClass());
	  System.out.println("一方的class:" + product.getDir().getClass());
	  //这里执行了SQL语句(因为使用到的类别的name在product表查询中没有,只能从数据库去查询)
	  System.out.println("一方非主键属性:" + product.getDir().getName());
	  entityManager.close();
}

3.4 二级缓存

一级缓存,不需要做任何配置,默认提供

3.4.1 添加二级缓存jar文件

hibernate-release-4.3.8.Final\lib\optional\ehcache\3个jar文件
在这里插入图片描述

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>4.3.8.Final</version>
</dependency>
3.4.2 添加persistence.xml配置信息
<!-- 启用二级缓存 -->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<!-- 二级缓存的实现类,文档里面的包名有错的 -->
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
<!-- 启用查询缓存 -->
<property name="hibernate.cache.use_query_cache" value="true" />
3.4.3 在上面添加配置二级缓存扫描的策略
<!-- ALL:所有的实体类都被缓存 -->
<!-- NONE:所有的实体类都不被缓存. -->
<!-- ENABLE_SELECTIVE:标识 @Cacheable(true) 注解的实体类将被缓存 -->
<!-- DISABLE_SELECTIVE:缓存除标识 @Cacheable(false) 以外的所有实体类 -->
<!-- UNSPECIFIED:默认值,JPA 产品默认值将被使用 -->
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

二级缓存:属于EntityManagerFactory级别缓存,它不是自带,如果要使用二级缓存,相应配置之后,才能使用二级缓存 — 通过Encache 框架来实现二级缓存

命中条件:同一个EntityManagerFactory,不同一个entityManager,发出的sql语句必须相同并且查询的条件值也要相同

  1. 如果查询缓存有查询条件,就不要使用查询缓存,因为命中率非常低
  2. 查询缓存里面查询指的是使用jpql,sql进行的查询,就是调用了createQuery方法,find方法不是走查询缓存
  3. 进行domain类的二级缓存的配置

4 缓存理论

4.1 什么时候使用二级缓存

  1. 读取大于修改;
  2. 对数据要有独享控制,数据不会被第三方修改;
  3. 可以容忍出现无效数据,非关键数据(不是财务数据等)
  4. 数据量不能超过内存容量,数据量特别巨大,此时不适合于二级缓存(钝化)

缓存淘汰策略:
LRU(Least Recently Used):最近最少使用 --> 时间为参考点
LFU(Least Frequently Uesd):最不经常使用 -->次数为参考点
FIFO(First in First Out):先进先出 quene

4.2 缓存命中条件

4.2.1 一级缓存

同一个EntityManagerFactory, 同一个EntityManager, OID相同

4.2.2 Domain类的二级缓存配置

同一个EntityManagerFactory,不同一个EntityManager,OID相同
Domain类上面配置@Cacheable(true)

4.2.3 查询缓存

同一个EntityManagerFactory,不同一个EntityManager,发出的sql语句必须相同并且查询的条件值也要相同

Spring Data JPA知识 day02 一、JPA中的主键生成策略 通过annotation(注解)来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的。这里的@id和@GeneratedValue都是JPA的标准用法。 JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO。 具体说明如下: IDENTITY:主键由数据库自动生成(主要是自... 阅读详情

相关推荐

Spring Data JPA知识 day01

一、ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射。在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中。只要有一套程序能够做到建立对象与数据库的关联,操作对象就可以直接操作数据库数据,就可以说这套程序实现了ORM对象关系映射 简单的说:ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。 1.1 为什么使用ORM 当实现一个应用程序时(不使用O/R M...

小陈工的博客 309

JPA:identifier of an instance of (entity )was altered from 数字 to null;

项目场景: 报错如下 identifier of an instance of com.pcitc.swm.pm.SolidWasteStorRec was altered from 4 to null; nested exception is org.hibernate.HibernateException: identifier of an instance of com.pcitc.swm.pm.SolidWasteStorRec was altered from 4 to null 问题描述:

learning_IT_boy的博客 6287

Spring Data JPA知识 day03

一、Spring Data JPA的概述 1.1概述 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率! Spring Data JPA 让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Sp...

小陈工的博客 219

was altered from xxx to null; nested exception is org.hibernate.HibernateException

was altered from xxxto null; nested exception is org.hibernate.HibernateException 直接上干货:在使用JPA时 如果使用的保存方法在保存数据库已存在的对象时,而这时你将数据库的已存在的数据传过来并使其主键id为null 这时如果调用JPA的修改方法就出出现这个错误 .解决办法 在一个事务中当使其主键id为null调用JPA自带的save方法而不是update方法 ...

softstarhhy的专栏 3403

使用KITTI数据集测试不同算法的性能

该文章将使用同一个kitti数据集来测试不同算法的性能,目前已经测试的算法包括:LIO-SAM,FAST-LIO2,Point-LIO,Faster-LIO。

wwtx的博客 2586

3线SWD接线终极指南:用Jlink调试非3.3V设备的5个关键细节

本文详细解析了使用Jlink调试非3.3V设备时,3线SWD接线的5个关键细节。核心在于正确理解并连接Vref引脚以实现电压适配,避免供电冲突,并掌握精简接线法与固件修复技巧。文章以STM32F205等芯片为例,指导开发者安全、高效地进行混合电压调试。

e4f5g6h7的博客 437

JPA更改新增操作报错identifier an instance of .... was altered from 58 to nuLL;

原因如下: 解决的办法是因为我前面的代码位置错误而导致更改一下边可,因为我用到的BeanUtils.copyProperties(sources,target) 一开始我是反过来导致的问题,后面过仔细勘察,才发现反了,一开始BeanUtils.copyProperties(put1,put)这样存在问题 正确的是BeanUtils.copyProperties(put,put1) ,下图是正确的,一下图为例 如图所示: ...

John的博客 3088

DeepBSA实战指南:从安装到基因组分析的全流程解析

本文详细解析了DeepBSA工具从安装到基因组分析的全流程,特别介绍了其简化生物信息学分析的'一键式'操作和独家深度学习算法。通过实战案例展示了DeepBSA在信噪比处理和QTL定位上的优势,并提供了Linux和Windows系统的安装避坑指南、数据预处理技巧以及算法选择建议,帮助用户高效完成基因组分析。

weixin_28732953的博客 436

Spring Data JPA 原理与实战第七天 JpaRepoitory进阶、Auditing使用

11 JpaRepoitory 如何自定义? 通过前面课时的内容,相信你已经掌握了很多 Repository 的高级用法,但是在实际工作场景中也难免会出现自定义 Repsitory 实现类的场景,这一课时我们就来看一下如何定义自己的 Repository 实现类。要知道 JPA 的操作核心是 EntityManager,那么我们先看看 Entitymanager 究竟为何物。 EntityManager 介绍 Java Persistence API 规定,操作数据库实体必须要通过 EntityManag

fegus的博客 1657

骁龙X Elite笔记本重装Windows 11 Arm64系统完整指南与避坑手册

UEFI安全启动和Arm64架构是理解现代计算设备系统部署的基础。UEFI取代传统BIOS,提供了更安全的启动环境和模块化固件接口,而Arm64架构则以其高能效特性,在移动和新兴PC领域日益重要。其技术价值在于为设备带来更快的启动速度、更强的安全防护以及更优的功耗表现。在应用场景上,这直接关系到搭载高通骁龙X Elite等Arm处理器的笔记本电脑的系统安装与维护。对于这类设备,重装系统远非插入通用安装盘那么简单,核心挑战在于必须使用专为Arm64编译的Windows镜像,并需提前集成芯片组、网络等硬件的专属

weixin_33428613的博客 474

【LLM数据篇】预训练数据集+指令生成sft数据集

在《Aligning Large Language Models with Human: A Survey》综述中对LLM数据分类为典型的人工标注数据、self-instruct数据集等 优秀的开源sft数据集:alpaca_data、belle、千言数据集、firefly、moss-003-sft-data多轮对话数据集等 文章目录 note 构造指令实例的3种方式 sft:Aligning Large Language Models with Human: A Survey Alpaca 1. self

发现问题,并解决问题,批判性思维 1万+

jpa_day02学习总结

Jpa-day2一.主键生产策略1.1主键设置的两种方式1.2四种主键生成策略1.2.1 IDENTITY:自增策略1.2.2 SEQUENCE:序列策略1.2.3 AUTO:自动(默认)1.2.4 Table:表策略二.对象的状态脏数据更新持久化对象的OID不允许修改三.对象之间的关系3.1 依赖关系3.2 关连关系3.2.1 多重性3.2.2 导航性聚合关系组合关系四.单项多对一的配置注意点五...

wangyisheng233的博客 275

基于STM32设计的智能防盗单车锁_349

本设计基于STM32F103RCT6单片机,研制了一种适用于户外环境的智能防盗单车锁系统。系统集成了GPS定位模块、ADXL345加速度传感器、4G通信模块(Air780E)、OLED显示屏、继电器模拟锁控模块等硬件,通过姿态感知实现车辆异常移动检测,在锁车状态下自动触发蜂鸣器报警并通过短信与APP通知用户。

865

三天快速入门Spring Data JPA之day02

文章目录第1章Spring Data JPA的概述1.1概述简介1.2Spring Data JPA的特性1.3Spring Data JPA 与 JPA和hibernate之间的关系第2章Spring Data JPA的快速入门2.1需求说明完成增删改查操作环境搭建测试增删改查保存更新用户删除第3章Spring Data JPA的内部原理剖析条件查询案例统计查询传入id查询账号是否存在getOne进行id查询第4章Spring Data JPA复杂查询JpaSpecificationExecutor使用占

xtho62的博客 523

SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程-第一篇:ADT安装前置准备与环境校验教程

ABAP Development Tools(ADT)安装配置教程摘要 本文是ADT安装系列的第一篇,重点讲解环境准备与版本校验。ADT是基于Eclipse的现代ABAP开发工具,相比传统SAP GUI提供更智能的开发体验。安装前需确认: 推荐使用Eclipse 2026-03 + Java 21组合 操作系统需Windows 10+/macOS 14+ SAP GUI版本要求Windows≥8.00/macOS≥8.10 后端系统需NetWeaver 7.31 SP04+或S/4HANA 通过java -

baidu_35680696的博客 681

大模型风电功率预测:短期,超短期,中长期的完整实现与代码详解

本文全面介绍了基于深度学习大模型的风电功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)三种时间尺度。文章详细阐述了数据准备与特征工程,包括数据收集、预处理和可视化分析。针对不同时间尺度,分别介绍了Temporal Fusion Transformer (TFT)、Informer和N-BEATS模型的构建、训练与评估方法,并提供了完整的开源代码实现。此外,文章还探讨了模型部署与生产环境集成,包括模型保存与加载、实时预测API以及模型监控与再训练。最后,文章总结了关键创新

专注AI大模型,软件混淆,授权 1886

JPA学习Day1

JPA学习Day1 1.什么是jpa? 1.JPA是Java Persistence API的简称。 2.JPA作为 Java EE 5.0 平台标准的 对象关系映射(ORM) 规范 2.Hibernate和JPA的关系 Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级(相对于EJB这一套)的对象封装,它将POJO(就是咱们的domain)与数据库表建立...

sdadaada的博客 174

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jpa_day03学习总结

JPA-day03-关系配置一.单向一对多代码配置二.双向多对一,一对多三.级联四.多对多五.一对一(了解)六.注意: 一.单向一对多 性能非常差,不建议使用 如果要使用,建议使用双向的多对一,一对多 代码配置 必需使用接口声明 可以使用List(有序允许重复)或者Set 一定要指定外键(否则会出现中间表) @OneToMany @JoinColumn(name = "dir_id ") ...

wangyisheng233的博客 182

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Activiti工作流Day10-JPA

Activiti中的Java持久层APIActiviti中JPA简介JPA实体要求JPA配置JPA用法简单示例查询JPA流程变量使用Spring beans和JPA结合的高级例子 Activiti中JPA简介 可以使用JPA实体作为流程变量, 并进行操作: 基于流程变量更新已有的JPA实体,可以在用户任务的表单中填写或者由服务任务生成 重用已有的领域模型,不需要编写显示的服务获取实体或者更新实...

攻城狮Chova的博客 1215

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JPA_Day2

一、主键生成策略 (一)主键 1、什么是主键:能够区分表里面每一行数据 2、主键特点:非空且唯一 3、主键分类: 1>自然主键 :具有实际意义的列来作为主键 2>代理主键 :没有实际意义的列来作为主键 --单体项目 (二)主键生成的策略 1、JPA标准策略有4种:auto策略、table策略、sequence策略、identity策略; (1)auto策略 :默认使用这种:根据数据...

Dear__Liu的博客 217

Day 04 -Spring Data JPA总结

Spring data jpa ORM思想 ​ 主要目的: 操作实体类就相当于操作数据库表 ​ 建立两个映射关系: ​ 实体类和表的映射关系 ​ 实体类中属性和表中字段的映射关系 ​ 不在重点关注: sql语句 ​ 实现ORM框架: mybatis , hibernate JPA概述 ​ JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。 ​ JPA通过JDK 5.0注解描述对象-关系

hfghrth的博客 316

JPA入门_day01

文章目录1 JPA入门1.1 什么是JPA1.2 为什么需要JPA1.3 Hibernate和JPA的关系1.4 JDBC和JPA的优缺点1.4.1 jdbc优缺点1.4.2 JPA优缺点2 jpa的使用2.1 导入依赖的jar包2.2 persistence.xml的配置2.3 使用JPA完成一个新增操作2.4 建表策略2.5 单表映射配置 1 JPA入门 1.1 什么是JPA JPA是Jav...

Java_pipixia的博客 301

jpa_day01学习总结

Jpa-day1一.理论1.1什么是jpa1.2什么是ORM1.3 JPA与JDBC的区别二.hello2.1 新建项目支持2.2 导包2.3 引入persistence.xml2.3.1 使用工具生成 META-INF\persistence.xml2.4 准备domain对象2.5 基本功能测试三.CRUD3.1 添加3.2修改3.3删除修改3.4查询一条数据3.5查询所有四.建表策略4.1 ...

wangyisheng233的博客 289

JPA Day2

1.JPA的主键生成策略 @GeneratedValue(strategy = GenerationType.AUTO) -- 默认根据方言来选择(默认) @GeneratedValue(strategy = GenerationType.IDENTITY) -- ID自增长策略。只能用于支持ID自增长的数据库 @GeneratedValue(strategy = GenerationType.S...

SaoLife的博客 264

JPA_Day1

一、认识JPA 1、什么是JPA (1)Java持久层API,jpa就是做持久层,操作数据库 (2)它是对象映射框架(ORM)的规范 2、为什么需要JPA (1)以前使用jdbc,在对象和数据库数据之间转换特别麻烦 (2)他以面向对象的思维来操作数据,比如我操作一个java里面对象,就相当于操作数据库表数据 3、Hibernate和JPA的关系 Hibernate:它是ORM这个规范实现的框架 J...

Dear__Liu的博客 257

三天快速入门Spring Data JPA之day01

springdatajpa三天学习安排: day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 回顾JDBC JDBC步骤:(连接前提导入驱动jar) 1.反射获取驱动 2.获得连接对象,get方法获取数据库连接(传参数=》数据库连接地址,用户名,密码) 3…创建Sql语句(利用占位符填充) 4.获取执行sql语句的对象Statement 1、执行静态SQL语句。通常通过Statement实例实

xtho62的博客 432
上一篇: JPA入门_day01
下一篇: java面试_基础
虞铭轩、
博客等级 码龄7年 3粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值