最近在做一个项目(spingMVC+jpa+mybatis+spring+mysql+...),期间遇到一些棘手的问题,这里贴上关键部分代码如下。
在执行修改的时候根据ID获取指定用户,拿到的实体的状态会不一样呢?
如果将DAO层的findById方法的事务注解 propagation = Propagation.NOT_SUPPORTED 去掉的话,修改时拿到的实体的状态就都是一样的,都是持久化状态的!
为什么呢??很是不解!希望高手们帮忙解惑下!!!
Service层部分代码如下:
@Service("userService") @Transactional public class UserServiceImpl implements UserService { @Autowired DAO<?> dao; /** 日志 */ private final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); @Override @Transactional(readOnly = true) public TUser getUserById(final String id) { TUser user = this.dao.findById(id, TUser.class); this.dao.contains(user); return user; } @Override @Transactional(rollbackFor = {Exception.class}, propagation = Propagation.REQUIRED) public void saveOrUpdateUser(TUser user) { synchronized (logger) { if (user != null) { String error = null; if (StringUtils.isBlank(user.getId())) { // 新增用户 user.setId(PlatformTools.getID()); user.setPassword(MD5Utils.md5(user.getPassword())); PasswordEncrypt passwordHelper = new PasswordEncrypt(); passwordHelper.encryptPassword(user);// 加密密码 this.dao.save(user); } else { // 修改用户 //************************************************************************************************ TUser entity = this.getUserById(user.getId()); // 1、返回的实体是游离状态 //TUser entity = this.dao.findById(user.getId(), TUser.class); // 2、返回的实体是持久化状态 //************************************************************************************************ if (entity == null) { error = "用户信息不存在!"; logger.error(error); throw new BusinessException(error); } entity.setUserName(user.getUserName()); entity.setSex(user.getSex()); entity.setBirthDate(user.getBirthDate()); entity.setSignCard(user.getSignCard()); entity.setEmail(user.getEmail()); //游离状态时需要调用该update方法才可真正执行SQL语句; //而实例化状态时无需执行该方法,只需调用上面属性的set方法,待事务提交时也可执行SQL语句 this.dao.update(entity); } } } } @Override @Transactional(rollbackFor = {Exception.class}) // @Transactional(propagation = Propagation.NOT_SUPPORTED) public void deleteUser(String[] ids) { synchronized (logger) { if (ids != null && ids.length > 0) { /*this.dao.delete(ids, TUser.class);*/ for (String id : ids) { if (StringUtils.isNotBlank(id)) { TUser user = this.getUserById(id); if (user != null) { this.dao.delete(user); } } } } } } }
Dao层部分代码如下:
@Repository("daoSupport") @Scope("singleton") public class DaoSupport<T> implements DAO<T> { Logger log = LoggerFactory.getLogger(DaoSupport.class); @PersistenceContext @Qualifier(value = "entityManagerFactory") private EntityManager em; // @SuppressWarnings("rawtypes") @Autowired SqlDao<?> sqlDao; public boolean contains(Object entity){ boolean bl = em.contains(entity); log.info("实体对象是否处于【持久化状态】:" + bl); return bl; } @SuppressWarnings("hiding") @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) public <T> T findById(String id, Class<T> clazz) { Domain domain = (Domain) em.find(clazz, id); log.info("【持久化状态】:" + em.contains(domain)); return (T) domain; } }
本想把代码关键部分用不同颜色标注出来,请原谅我不会用,怎么设置预览都不行~
相关推荐
SpringBoot整合JPA实现自动创建数据库表自动建表,JPA逆向生成数据库表 运行环境 jdk8+tomcat9+mysql+IntelliJ IDEA+maven 项目技术(必填) springboot+jpa 数据库文件(可选) 新建一个test的数据库即可,表在...
产生原因:因为使用 jpa 自动创建表的时候,采用的是TreeMap的,我们要变成LinkedHashMap 的结构。 解决方案:在项目下java文件夹下创建包名为: org.hibernate.cfg ,创建类: PropertyContainer [包名,类名...
生成JPA的实体,带annotation,包括@Entity,@Table(name=xx),@Id,@GeneratedValue,@Column(name=xx) 输出表和字段的comment,包含字段的类型长度 自动生成包名
3. **更新(Update)**: 修改实体属性,然后调用`EntityManager.merge()`方法同步到数据库。 ```java entity.setName("Updated Entity"); em.getTransaction().begin(); em.merge(entity); em.getTransaction()....
springboot jpa 自动生成实体类的 文件 可以拿走直接用 Generate POJOs.groovy
新建一个test的数据库即可,表在springboot启动后自动新建 依赖包文件(可选) Maven管理jar包依赖,编译工程自动下载 链接:https://pan.baidu.com/s/1QYVjX-0FeWquWz9zY87oVQ?pwd=ilah 提取码:ilah
在标题和描述中提到的"JPA_由数据库生成JavaBean",是指JPA提供的一项功能,即反向工程(Reverse Engineering),可以从现有的数据库模式自动生成对应的Java实体类,这些类通常被称为JavaBeans,因为它们遵循...
在这个教程中,我们将探讨如何使用MyEclipse通过JPA(Java Persistence API)方式来自动生成带有注解的实体类,这将极大地简化数据库表与Java对象之间的映射工作。 首先,我们需要配置MyEclipse的数据源。在...
每个实体类代表一个数据库表,类中的属性对应表中的字段。需要使用`@Entity`注解标记实体类,并使用`@Table`注解指定对应的表名。 3. **主键(Primary Key)**:每个实体类通常都有一个主键字段,用`@Id`注解标记。...
- **注解配置**: 使用Java注解(@Entity, @Table, @Id等)在实体类上定义数据库映射。 - **XML配置**: 通过persistence.xml文件定义实体、实体管理器工厂和其他配置信息。 - **混合配置**: 结合注解和XML,根据...
其中,`spring.jpa.hibernate.ddl-auto`属性决定了数据库的自动管理策略,`update`表示启动时更新已有表结构,如果表不存在则创建。 3. **创建实体类** 创建Java类作为数据库表的映射,使用`@Entity`注解标记,...
本文将详细介绍如何在Eclipse环境中配置JPA,以便自动生成数据库表对应的已注解实体类。 首先,我们需要创建一个JPA项目。在Eclipse中,右键点击工作空间,选择"New" -> "Other…",在弹出的对话框中,搜索并选择...
在Spring Boot框架中,Java Persistence API (JPA) 和 Spring Data JPA 是两个非常重要的组件,它们极大地简化了数据库操作。Spring Boot集成了这些技术,使得开发者能够快速、高效地处理数据库事务。以下是对如何在...
通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`等注解,可以灵活地在实体类中表示各种关系。 总之,JPA为Java开发者提供了一套强大的工具集,用于处理与数据库相关的操作。通过深入学习和实践,...
此异常表明在配置`EntityManagerFactory`时遇到了问题,可能是由于配置文件(如`persistence.xml`)中的错误,或者是依赖的JPA提供者(如Hibernate)版本不兼容。检查配置文件的正确性和所有依赖库的版本一致性。 #...
Spring Boot 中 JPA 的 save 方法不更新 null 属性解决方案 知识点 1: JPA 的 save 方法的问题 在 Spring Boot 中使用 JPA 时,直接调用原生 Save 方法会导致 null 属性覆盖到数据库,使用起来十分不方便。这是...
在现在这种国际形势下,网络安全是每个企业,乃至整个国家重中之重的事,国产化是一种趋势,在整合之前先了解一下达梦数据库。达梦数据库官网:本篇主要讲整合,详细介绍会在别的文章中。 1.达梦数据库管理系统是...
在使用 Spring Data Jpa 进行数据更新时,经常会遇到一个问题,即当属性值为 Null 时,也会被更新,这将导致原本没有更新的属性值全部变为 Null。这个问题的解决方案是使用 @DynamicUpdate 注解,但是这种方法并不好...
别名转实体是JPA中的一个概念,它涉及到如何通过别名来查询数据库并映射到对应的实体类上。 在JPA中,我们经常需要处理SQL查询结果,这些结果可能包含别名,例如在HQL(Hibernate Query Language)或JPQL(Java ...
实体类通常包含属性、getter和setter方法,以及JPA注解来定义数据库映射。 - **DAO(数据访问层)**:这一层的代码负责与数据库进行交互,使用JPA的Repository接口。例如,我们可以创建一个`UserRepository`接口,...