`
358331899
  • 浏览: 6865 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

在解决JPA中 如何防止修改实体的属性后不自动更新数据库问题时遇到的其它问题???

阅读更多

最近在做一个项目(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 自动创建表的时候,采用的是TreeMap的,我们要变成LinkedHashMap 的结构。 解决方案:在项目下java文件夹下创建包名为: org.hibernate.cfg ,创建类: PropertyContainer [包名,类名...

    SpringBoot整合JPA实现自动创建数据库表自动建表,JPA逆向生成数据库表.zip

    SpringBoot整合JPA实现自动创建数据库表自动建表,JPA逆向生成数据库表 运行环境 jdk8+tomcat9+mysql+IntelliJ IDEA+maven 项目技术(必填) springboot+jpa 数据库文件(可选) 新建一个test的数据库即可,表在...

    Intellij Idea 数据库生成JPA实体的模板

    生成JPA的实体,带annotation,包括@Entity,@Table(name=xx),@Id,@GeneratedValue,@Column(name=xx) 输出表和字段的comment,包含字段的类型长度 自动生成包名

    jpa实现数据库操作

    - **注解配置**: 使用Java注解(@Entity, @Table, @Id等)在实体类上定义数据库映射。 - **XML配置**: 通过persistence.xml文件定义实体、实体管理器工厂和其他配置信息。 - **混合配置**: 结合注解和XML,根据...

    JPA连接数据库增删改查

    3. **更新(Update)**: 修改实体属性,然后调用`EntityManager.merge()`方法同步到数据库。 ```java entity.setName("Updated Entity"); em.getTransaction().begin(); em.merge(entity); em.getTransaction()....

    毕业设计-SpringBoot整合JPA实现自动创建数据库表自动建表,JPA逆向生成数据库表项目源码.zip

    新建一个test的数据库即可,表在springboot启动后自动新建 依赖包文件(可选) Maven管理jar包依赖,编译工程自动下载 链接:https://pan.baidu.com/s/1QYVjX-0FeWquWz9zY87oVQ?pwd=ilah 提取码:ilah

    JPA_由数据库生成JavaBean

    在标题和描述中提到的"JPA_由数据库生成JavaBean",是指JPA提供的一项功能,即反向工程(Reverse Engineering),可以从现有的数据库模式自动生成对应的Java实体类,这些类通常被称为JavaBeans,因为它们遵循...

    Myeclipse自动生成注解实体类O---JPA方式

    在这个教程中,我们将探讨如何使用MyEclipse通过JPA(Java Persistence API)方式来自动生成带有注解的实体类,这将极大地简化数据库表与Java对象之间的映射工作。 首先,我们需要配置MyEclipse的数据源。在...

    springboot jpa 自动生成实体类的 文件 Generate POJOs.groovy

    springboot jpa 自动生成实体类的 文件 可以拿走直接用 Generate POJOs.groovy

    jpa操作mysql数据库

    每个实体类代表一个数据库表,类中的属性对应表中的字段。需要使用`@Entity`注解标记实体类,并使用`@Table`注解指定对应的表名。 3. **主键(Primary Key)**:每个实体类通常都有一个主键字段,用`@Id`注解标记。...

    springboot集成jpa代码,自动生成表

    其中,`spring.jpa.hibernate.ddl-auto`属性决定了数据库的自动管理策略,`update`表示启动时更新已有表结构,如果表不存在则创建。 3. **创建实体类** 创建Java类作为数据库表的映射,使用`@Entity`注解标记,...

    Eclipse下如何配置JPA生成数据库表对应的已注解实体类(图文详解)

    本文将详细介绍如何在Eclipse环境中配置JPA,以便自动生成数据库表对应的已注解实体类。 首先,我们需要创建一个JPA项目。在Eclipse中,右键点击工作空间,选择"New" -&gt; "Other…",在弹出的对话框中,搜索并选择...

    Springboot中使用JPA操作数据库

    在Spring Boot框架中,Java Persistence API (JPA) 和 Spring Data JPA 是两个非常重要的组件,它们极大地简化了数据库操作。Spring Boot集成了这些技术,使得开发者能够快速、高效地处理数据库事务。以下是对如何在...

    EJB_JPA数据库持久层开发详解

    通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`等注解,可以灵活地在实体类中表示各种关系。 总之,JPA为Java开发者提供了一套强大的工具集,用于处理与数据库相关的操作。通过深入学习和实践,...

    JPA 开发中遇到的错误

    此异常表明在配置`EntityManagerFactory`时遇到了问题,可能是由于配置文件(如`persistence.xml`)中的错误,或者是依赖的JPA提供者(如Hibernate)版本不兼容。检查配置文件的正确性和所有依赖库的版本一致性。 #...

    详解SpringBoot实现JPA的save方法不更新null属性

    Spring Boot 中 JPA 的 save 方法不更新 null 属性解决方案 知识点 1: JPA 的 save 方法的问题 在 Spring Boot 中使用 JPA 时,直接调用原生 Save 方法会导致 null 属性覆盖到数据库,使用起来十分不方便。这是...

    JPA整合达梦数据库实例

    在现在这种国际形势下,网络安全是每个企业,乃至整个国家重中之重的事,国产化是一种趋势,在整合之前先了解一下达梦数据库。达梦数据库官网:本篇主要讲整合,详细介绍会在别的文章中。 1.达梦数据库管理系统是...

    详解Spring Data Jpa当属性为Null也更新的完美解决方案

    在使用 Spring Data Jpa 进行数据更新时,经常会遇到一个问题,即当属性值为 Null 时,也会被更新,这将导致原本没有更新的属性值全部变为 Null。这个问题的解决方案是使用 @DynamicUpdate 注解,但是这种方法并不好...

    jpa 别名转实体

    别名转实体是JPA中的一个概念,它涉及到如何通过别名来查询数据库并映射到对应的实体类上。 在JPA中,我们经常需要处理SQL查询结果,这些结果可能包含别名,例如在HQL(Hibernate Query Language)或JPQL(Java ...

    jpa代码自动生成工具-springboot

    实体类通常包含属性、getter和setter方法,以及JPA注解来定义数据库映射。 - **DAO(数据访问层)**:这一层的代码负责与数据库进行交互,使用JPA的Repository接口。例如,我们可以创建一个`UserRepository`接口,...

Global site tag (gtag.js) - Google Analytics