Spring Data JPA实体的生命周期总结
目录
- 四种状态
- API示例  
- persist
- remove
- merge
- refresh
 
- 参考链接
四种状态
首先以一张图,简单介绍写实体生命周期中四种状态之间的转换关系:

瞬时(New):瞬时对象,刚New出来的对象,无id,还未和持久化上下文(Persistence Context)建立关联。
托管(Managed):托管对象,有id,已和持久化上下文(Persistence Context)建立关联,对象属性的所有改动均会影响到数据库中对应记录。
- 瞬时对象调用em.persist()方法之后,对象由瞬时状态转换为托管状态
- 通过find、get、query等方法,查询出来的对象为托管状态
- 游离状态的对象调用em.merge方法,对象由游离状态转换为托管状态
游离(Datached):游离对象,有id值,但没有和持久化上下文(Persistence Context)建立关联。
- 托管状态对象提交事务之后,对象状态由托管状态转换为游离状态
- 托管状态对象调用em.clear()方法之后,对象状态由托管状态转换为游离状态
- New出来的对象,id赋值之后,也为游离状态
删除(Removed):执行删除方法(em.remove())但未提交事务的对象,有id值,没有和持久化上下文(Persistence Context)建立关联,即将从数据库中删除。
API示例
针对JPA规范的四个方法,写了一个简单的Demo,进行了一一的验证,以下进行验证过程说明,完整代码传送门:https://github.com/hdlxt/SpringDataJpaDemo.git
整体结构如下:

persist
不同状态下执行em.persist()方法产生结果:
- 瞬时态:转化为托管态
- 托管态:不发生改变,但执行instert语句
- 删除态:转化为托管态
- 游离态:抛异常
验证删除态和游离态持久化如下:
1.持久化删除态
- 代码
| 1 | /** | 
- 步骤
- 结果:结果数据并未删除,而且name由lxt变为persist remove success!
2.持久化游离态
- 代码 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17- /** 
 * 持久化游离态的对象
 *@param id
 * @return
 */
 @RequestMapping("/persisDetached/{id}")
 public String persisDetached(@PathVariable("id")Long id){
 try {
 User user = userDao.findById(id);
 userDao.clear();
 userDao.persist(user);
 }catch (Exception e){
 logger.error("持久化一个游离态的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
- 步骤 
- 结果:抛异常 - 1 
 2
 3
 4
 5
 6
 7
 8
 9- 2019-01-26 00:00:34.090 ERROR 5228 --- [io-8080-exec-10] c.e.demo.controller.UserController : 持久化一个游离态的对象! 
 org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.example.demo.entity.User; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.example.demo.entity.User
 at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:317) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:253) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 
 ....
remove
不同状态下执行em.remove()方法产生结果:
- 瞬时态:对状态无影响,后台打印日志
- 托管态:转化为托管态
- 删除态:无影响,什么都不发生
- 游离态:抛异常Removing a detached instance com.example.demo.entity.User...
验证过程如下:
1.瞬时态
- 代码 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16- /** 
 * 删除new出来的对象
 *@param id
 * @return
 */
 @RequestMapping("/removeNew")
 public String removeNew(){
 try {
 User user = new User().setName("lxt").setNumber("007");
 userDao.remove(user);
 }catch (Exception e){
 logger.error("删除(remove)一个new的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
- 步骤 
- 结果:返回 - SUCCESS!后台输出日志- 1 - 2019-01-26 00:17:32.811 INFO 10136 --- [nio-8080-exec-5] o.h.e.i.DefaultDeleteEventListener : HHH000114: Handling transient entity in delete processing 
2.删除态
- 代码 - 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- /** 
 * 删除 删除态对象
 *@param id
 * @return
 */
 @RequestMapping("/removeRemove/{id}")
 public String removeRemove(@PathVariable("id")Long id){
 try {
 User user = userDao.findById(id);
 userDao.removeRemove(user);
 }catch (Exception e){
 logger.error("删除(remove)一个删除态的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
 -----------------------------------------------------
 /**
 * 删除 删除态的对象
 *
 * @param user
 */
 @Override
 public void removeRemove(User user) {
 remove(user);
 remove(user);
 }
- 步骤 
- 结果:返回 - SUCCESS!,后台输出一个查询sql和一个删除sql,证明第二个删除没有影响- 1 
 2- Hibernate: select user0_.id as id1_0_, user0_.name as name2_0_, user0_.number as number3_0_ from t_user user0_ where user0_.id=? 
 Hibernate: delete from t_user where id=?
3.游离态
- 代码 - 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- /** 
 * 删除游离态对象
 *@param id
 * @return
 */
 @RequestMapping("/removeDetached/{id}")
 public String removeDetached(@PathVariable("id")Long id){
 try {
 User user = userDao.findById(id);
 userDao.removeDetached(user);
 }catch (Exception e){
 logger.error("删除(remove)一个游离态的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
 -------------------------------------------------------------
 /**
 * 删除游离态的对象
 *
 * @param user
 */
 @Override
 public void removeDetached(User user) {
 clear();
 remove(user);
 }
- 步骤 
- 结果:返回 - ERROR!抛异常- 1 
 2
 3
 4
 5
 6
 7
 8- 2019-01-26 00:14:11.071 ERROR 5228 --- [io-8080-exec-10] c.e.demo.controller.UserController : 删除(remove)一个游离态的对象! 
 org.springframework.dao.InvalidDataAccessApiUsageException: Removing a detached instance com.example.demo.entity.User#5; nested exception is java.lang.IllegalArgumentException: Removing a detached instance com.example.demo.entity.User#5
 at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:373) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]
merge
不同状态下执行em.merge()方法产生结果:
- 瞬时态:提交到数据库,返回一个新的托管态的对象
- 托管态:根据原对象返回一个新的托管态的对象
- 删除态:抛异常org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.ObjectDeletedException: deleted instance passed to merge: [com.example.demo.entity.User#<null>]...
- 游离态:提交到数据库,进行更新或插入,返回一个新的托管态的对象
合并(merge)删除态和游离态验证过程如下:
1.删除态
- 代码 - 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- /** 
 * 持久化删除态的对象
 *@param id
 * @return
 */
 @RequestMapping("/mergeRemove/{id}")
 public String mergeRemove(@PathVariable("id")Long id){
 try {
 User user = userDao.findById(id);
 userDao.mergeRemove(user);
 }catch (Exception e){
 logger.error("合并(merge)一个删除态的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
 --------------------------------------------------------------------
 /**
 * 合并删除态的对象
 *
 * @param user
 */
 @Override
 public void mergeRemove(User user) {
 remove(user);
 merge(user);
 }
- 步骤 
- 结果:返回 - ERROR抛异常!- 1 
 2
 3
 4
 5
 6
 7
 8
 9- 2019-01-26 00:23:01.187 INFO 10136 --- [nio-8080-exec-3] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory 
 Hibernate: select user0_.id as id1_0_, user0_.name as name2_0_, user0_.number as number3_0_ from t_user user0_ where user0_.id=?
 2019-01-26 00:23:01.322 ERROR 10136 --- [nio-8080-exec-3] c.e.demo.controller.UserController : 合并(merge)一个删除态的对象!
 org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.ObjectDeletedException: deleted instance passed to merge: [com.example.demo.entity.User#<null>]; nested exception is java.lang.IllegalArgumentException: org.hibernate.ObjectDeletedException: deleted instance passed to merge: [com.example.demo.entity.User#<null>]
 at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:373) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]
2.游离态
- 代码 - 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- /** 
 * 持久化游离态的对象
 *@param id
 * @return
 */
 @RequestMapping("/mergeDetached/{id}")
 public String mergeDetached(@PathVariable("id")Long id){
 try {
 User user = userDao.findById(id);
 userDao.mergeDetached(user);
 }catch (Exception e){
 logger.error("合并(merge)一个游离态的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
 ---------------------------------------------------------------
 /**
 * 合并游离态的对象
 *
 * @param user
 */
 @Override
 public void mergeDetached(User user) {
 clear();
 User newUser = merge(user);
 newUser.setName("newUser merge detached success!");
 user.setName("user merge detached success!");
 }
- 步骤 
- 结果:对应实体的 - name值变为- newUser merge detached success!,证明返回新的对象为托管态对象
2.游离态
refresh
方法可以保证当前的实例与数据库中的实例的内容一致,注意:是反向同步,将数据库中的数据同步到实体中
不同状态下执行em.refresh()方法产生结果:
- 瞬时态:抛异常org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed;
- 托管态: 将数据库中的数据同步到实体中,返回一个托管态的对象。
- 删除态:抛异常org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed;
- 游离态:抛异常org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed;
总结:只有被托管的对象才可以被refresh。
1.瞬时态
- 代码 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16- /** 
 * 刷新new出来的对象
 *@param id
 * @return
 */
 @RequestMapping("/refreshNew")
 public String refreshNew(){
 try {
 User user = new User().setName("lxt").setNumber("007");
 userDao.refresh(user);
 }catch (Exception e){
 logger.error("刷新(refresh)一个new的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
- 步骤 
- 结果:返回 - ERROR!抛异常- 1 
 2
 3
 4
 5
 6
 7- 2019-01-26 00:38:18.037 ERROR 10136 --- [nio-8080-exec-3] c.e.demo.controller.UserController : 刷新(refresh)一个new的对象! 
 org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed; nested exception is java.lang.IllegalArgumentException: Entity not managed
 at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:373) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]
2.托管态:
- 代码 - 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- /** 
 * 刷新托管态对象
 *@param id
 * @return
 */
 @RequestMapping("/refreshManaged/{id}")
 public String refreshManaged(@PathVariable("id")Long id){
 try {
 User user = userDao.findById(id);
 userDao.refreshManaged(user);
 }catch (Exception e){
 logger.error("刷新(refresh)一个托管态的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
 ------------------------------------------------------------------
 /**
 * 刷新托管态的对象
 *
 * @param user
 */
 @Override
 public void refreshManaged(User user) {
 user.setName("refresh before!");
 refresh(user);
 logger.info("user:"+user);
 }
- 步骤 
- 结果:数据库中数据并无变化,日志打印为数据库中查询出的值,并未打印 - refresh before!
3.删除态
- 代码 - 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- /** 
 * 刷新删除态对象
 *@param id
 * @return
 */
 @RequestMapping("/refreshRemove/{id}")
 public String refreshRemove(@PathVariable("id")Long id){
 try {
 User user = userDao.findById(id);
 userDao.refreshRemove(user);
 }catch (Exception e){
 logger.error("刷新(refresh)一个删除态的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
 ----------------------------------------------------------------------
 /**
 * 刷新删除态的对象
 *
 * @param user
 */
 @Override
 public void refreshRemove(User user) {
 remove(user);
 user.setName("refresh remove before!");
 refresh(user);
 user.setName("refresh remove after!");
 }
- 步骤 
- 结果:返回 - ERROR!抛异常- 1 
 2
 3
 4
 5
 6
 7- 2019-01-26 00:40:57.713 ERROR 10136 --- [nio-8080-exec-3] c.e.demo.controller.UserController : 刷新(refresh)一个删除态的对象! 
 org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed; nested exception is java.lang.IllegalArgumentException: Entity not managed
 at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:373) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]
4.游离态
- 代码 - 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- /** 
 * 刷新游离态对象
 *@param id
 * @return
 */
 @RequestMapping("/refreshDetached/{id}")
 public String refreshDetached(@PathVariable("id")Long id){
 try {
 User user = userDao.findById(id);
 userDao.refreshDetached(user);
 }catch (Exception e){
 logger.error("刷新(refresh)一个游离态的对象!",e);
 return REPONSE_ERR;
 }
 return REPONSE_SUCCESS;
 }
 ----------------------------------------------------------------------
 /**
 * 刷新游离态的对象
 *
 * @param user
 */
 @Override
 public void refreshDetached(User user) {
 clear();
 refresh(user);
 }
- 步骤 
- 结果:返回 - ERROR!抛异常!- 1 
 2
 3
 4
 5
 6
 7- 2019-01-26 00:42:09.598 ERROR 10136 --- [nio-8080-exec-7] c.e.demo.controller.UserController : 刷新(refresh)一个游离态的对象! 
 org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed; nested exception is java.lang.IllegalArgumentException: Entity not managed
 at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:373) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
 at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]
参考链接
Spring Data JPA实体的生命周期总结的更多相关文章
- Spring Data JPA实体详解
		1. Spring Data JPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体.实体通常与底层数据库中的单个关系 ... 
- idea 从数据库快速生成Spring Data JPA实体类
		第一步,调出 Persistence 窗口. File—>Project Structure—>model—> + —>JPA 第二步:打开 Persistence窗口 配置 ... 
- spring data jpa实体类映射配置
		@Entity:用来标志实体类,知名这是一个和数据库表映射的实体类 @Id注解指明这个属性映射为数据库的主键 @GeneratedValue注解默认使用主键生成方式为自增,hibernate会自动生成 ... 
- 在Spring Data JPA 中使用Update Query更新实体类
		对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ... 
- Spring Data JPA 多个实体类表联合视图查询
		Spring Data JPA 查询数据库时,如果两个表有关联,那么就设个外键,在查询的时候用Specification创建Join 查询便可.但是只支持左连接,不支持右连接,虽说左右连接反过来就能实 ... 
- Spring Data Jpa系列教程--------实体解析和关联关系
		Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ... 
- spring data JPA entityManager查询 并将查询到的值转为实体对象
		spring data JPA entityManager查询 并将查询到的值转为实体对象 . https://blog.csdn.net/qq_34791233/article/details/81 ... 
- Spring Data JPA 查询结果返回至自定义实体
		本人在实际工作中使用Spring Data Jpa框架时,一般查询结果只返回对应的Entity实体.但有时根据实际业务,需要进行一些较复杂的查询,比较棘手.虽然在框架上我们可以使用@Query注解执行 ... 
- Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码
		大家好,又见面了. 这是本系列的最后一篇文档啦,先来回顾下前面4篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你 ... 
随机推荐
- python的代码块和if条件表达式
			代码块和if条件表达式 代码块 什么是代码块 以冒号作为开始,用缩进来划分作用域. 在之后的学习当中,使用if条件语句.for.while循环语句.定义函数.定义类等诸多地方都会涵盖代码的概念. 什么 ... 
- SpringBoot之yaml语法及静态资源访问
			配置文件-yaml 在spring Boot开发中推荐使用yaml来作为配置文件. 基本语法: key: value:kv之间有空格 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab,只允许空格 ... 
- TypeError: attrib() got an unexpected keyword argument 'convert'
			使用pyinstaller -F aaa.py时,报错 TypeError: attrib() got an unexpected keyword argument 'convert' 没有exe生成 ... 
- 第二十七篇 -- QTreeWidget总结
			前言 之前写过几篇关于TreeWidget的文章,不过不方便查阅,特此重新整合作为总结.不过关于QtDesigner画图,还是不重新写了,看 第一篇 就OK. 准备工作 1. 用QtDesigner画 ... 
- Win10强制程序高DPI缩放设置
			起因 工作原因,需要在win10上安装数个古老vc版本(vc6,vc2008,vc2010),但是显示器是2K的,DPI缩放有问题 尝试 VC6比较好解决:右键,属性,兼容性,更改高DPI设置,勾选替 ... 
- 【LeetCode】841. 钥匙和房间
			841. 钥匙和房间 知识点:图:递归 题目描述 有 N 个房间,开始时你位于 0 号房间.每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间. 在形式上, ... 
- python打包exe之pyinstaller用法
			pyinstaller可以将python写好的脚本打包成exe文件,方便windows用户在没有python环境下运行.这个程序完全跨平台,包括Windows.Linux.Mac OS X等多个操作系 ... 
- rein 多平台支持的超便携端口转发与内网穿透工具
			介绍 本程序主要用于进行反向代理IP地址和端口,功能类似于 nginx 的 stream 模式和rinetd 的功能:在(1.0.5)版本开始,rein支持内网穿透,这一功能类似于frp 和ngrok ... 
- [C++]-map和unordered_map
			转自:https://blog.csdn.net/BillCYJ/article/details/78985895 头文件不同 map: #include < map > unordere ... 
- 在游戏中播放cg视频遇到的问题
			遇到问题 我们线上手游要给港澳台用户增加cg视频,在我之前文章中已经讲到了我们是怎么在unity中播放cg的--><使用AVPro Video在Unity中播放开场视频(CG)笔记> ... 
