问题1:
当你在做修改的动作时,就算你不给这些按钮加上action,只要有值改变,它就会去执行更新动作。。。。我遇到的最头痛的问题是:当用户对某行数据进行修改的时候,在后台有个验证用户输入的方法,若输入的数据非法,则不会执行更新,并弹出提示框。 可是运行后却让出现这样的现象:输入非法的数据时,它会弹出提示消息,但是却执行了更新的动作!! 我把action去掉后,奇怪的是一但有值改变,它也会执行更新的动作。。。 只有<s:button />不会出现此问题
解决方法:
这是JPA的自动脏检测,解决办法,如果你是开启一个长会话,记得在@Begin里面将flushMode=设置为MANUAL模式,可解决这个问题,给你一个例子。
@Begin(join = true, flushMode = FlushModeType.MANUAL)
问题2:
<begin-conversation join="true" flush-mode="manual"/> ,而改成这样之后 就不会出现以上的问题了,可是页面中的值却跟着改变了,我刷新也没用,直到我关闭页面 重新运行页面,它的值才会显示成最初未改动的值。。。而在整个过程当中,DB的数据是一直没变的(这是我想要的),可是我怎么样才能让页面的值不会出现那种“假象”??
解决方法:
下面的给你个例子参考.你可以使用在你的实体中使用增加一个@PostLoad标记方法,来将name的初始值保存到nameInitial临时变量中.
@Transient
private String nameInitial;
@NotNull
@Column(name = "ROLE_NAME", length = 50)
@Length(max = 50)
private String name;
@PostLoad
public void afterLoad() {
this.nameInitial = this.name;
}
使用@PostLoad方法,这个是代表在实体装入时把name的初始值传给nameInitial,
这样你就可以保存你修改后name的初始值.
产生上面问题的缘由和解决的原因:
XML中的<begin-conversation join="true" flush-mode="manual"/>
等同于
@Begin(join = true,flushMode = FlushModeType.MANUAL)
意义是一样的,都是开启一个长会话,将flushMode设置为MANUAL,
将flushMode设置为MANUAL的原因,下面假如你是继承EntityHome或是HibernateEntityHome类,我以EntityHome源代码update方法为例说明.
/**
* Base class for Home objects of JPA entities.
*
* @author Gavin King
*
*/
public class EntityHome<E> extends Home<EntityManager, E> {
@Transactional
public String update()
{
joinTransaction();
getEntityManager().flush();
updatedMessage();
raiseAfterTransactionSuccessEvent();
return "updated";
}
}
注意@Transactional事务标记以及getEntityManager().flush(),如果标记为@Begin(join = true),将flushMode将默认为AUTO,意味着你对在会话期间对实体做的任何修改,持入化上下文将直接进行脏检测,发现实体修改Seam容器将会自动调用getEntityManager().flush()方法清空缓存,提交到数据库,所以才会产生你现在的问题.将flushMode设置为MANUAL将是告诉Seam由你自己来调用getEntityManager().flush()方法,也就是你想要的做完验证之后合法的数据再提交到数据库.当然这些问题还有可能取决于你Entity的equals()和hashCode()方法的重写,这是Hibernate与JPA的知识,这里不作过多的讨论.
而改成这样之后 就不会出现以上的问题了,可是页面中的值却跟着改变了,我刷新也没用,直到我关闭页面 重新运行页面,它的值才会显示成最初未改动的值。。。而在整个过程当中,DB的数据是一直没变的(这是我想要的),可是我怎么样才能让页面的值不会出现那种“假象”??
这个问题,相信你已经理解Spring与Seam最大的区别,一个是无状态的,一个是有状态的,以及Seam的双向注入@In @Out, 当你注释@Beject标志,或是在XML写入一个begin-conversation节点,都代表是开启一个长会话,直到你标记@End或是在XML 写入<env-conversation>标记,才会结束当前这个会话,在会话期间你对@Name("")标记的实体进行的修改,Seam都会返回到Seam管理的上下文中,说白点就是把修改的后的对象重新复制一份到Seam上下文容器中,Seam容器透明的管理.
解决办法,下面的给你个例子参考.你可以使用在你的实体中使用增加一个@PostLoad标记方法,来将name的初始值保存到nameInitial临时变量中.
@Transient
private String nameInitial;
@NotNull
@Column(name = "ROLE_NAME", length = 50)
@Length(max = 50)
private String name;
@PostLoad
public void afterLoad() {
this.nameInitial = this.name;
}
使用@PostLoad方法,这个是代表在实体装入时把name的初始值传给nameInitial,
这样你就可以保存你修改后name的初始值.
以上仅供参考,个人的理解.
分享到:
相关推荐
本工具可以根据数据库表自动生成JPA开发所需的实体JavaBean(带有jpa主注解)、repository及service类,提高开发效率;目前支持数据库:MYSQL;并提供配合演示使用的demo项目。
springboot jpa 自动生成实体类的 文件 可以拿走直接用 Generate POJOs.groovy
本文将深入探讨如何使用JPA和Spring Boot结合,实现代码自动生成工具,提高开发效率。 首先,让我们了解JPA。JPA通过提供一套标准API,使得开发者无需关注底层SQL语句,而是通过定义实体类、注解以及Repository接口...
SpringBoot整合JPA实现自动创建数据库表自动建表,JPA逆向生成数据库表 运行环境 jdk8+tomcat9+mysql+IntelliJ IDEA+maven 项目技术(必填) springboot+jpa 数据库文件(可选) 新建一个test的数据库即可,表在...
产生原因:因为使用 jpa 自动创建表的时候,采用的是TreeMap的,我们要变成LinkedHashMap 的结构。 解决方案:在项目下java文件夹下创建包名为: org.hibernate.cfg ,创建类: PropertyContainer [包名,类名...
JPA允许你在Java应用程序中以对象的形式处理数据,这些对象可以自动转换为数据库中的记录。 在JPA的例子中,我们通常会涉及以下几个核心概念: 1. **实体(Entity)**: 实体是与数据库表相对应的Java类。它们通常...
下面我们将深入探讨Spring Boot集成JPA实现数据库表自动生成的过程。 1. **添加依赖** 首先,我们需要在`pom.xml`或`build.gradle`文件中引入Spring Boot的JPA和相关数据库驱动依赖。例如,如果使用的是MySQL,...
SpringBoot整合JPA实现自动创建数据库表自动建表,JPA逆向生成数据库表 运行环境 jdk8+tomcat9+mysql+IntelliJ IDEA+maven 项目技术(必填) springboot+jpa 数据库文件(可选) 新建一个test的数据库即可,表在...
在这个教程中,我们将探讨如何使用MyEclipse通过JPA(Java Persistence API)方式来自动生成带有注解的实体类,这将极大地简化数据库表与Java对象之间的映射工作。 首先,我们需要配置MyEclipse的数据源。在...
JPA代码生成器 1.生成domain dao ,service, mvc文件 2.对应的框架有JPA,spring MVC ,HIBERNATE 3.默认文件生成目录在D:\CODEGEN,直接修改工程源码即可 4.运行方法:JDBCCodeGenerator ,修改public static void ...
该项目是一款基于Java语言的JPA自动生成工具,提供源码设计功能,包含20个文件,涵盖10个Java源文件、7个FTL模板文件、1个Git忽略文件、1个XML配置文件、1个YAML配置文件。该工具旨在提高JPA开发效率,适用于需要...
**JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它简化了在Java应用程序中存储、检索和管理对象的工作。JPA是Java EE和Java SE环境中的一种ORM(Object-Relational Mapping)...
例如,Spring Data JPA支持自动化的查询生成,只需定义Repository接口,无需编写任何实现代码,就可以执行CRUD(创建、读取、更新、删除)操作。此外,它还支持复杂的查询方法命名,如findByXXX,根据方法名自动构建...
- `@GeneratedValue`:用于自动生成主键值,支持多种策略如IDENTITY、SEQUENCE、TABLE等。 - `@Column`:定义实体属性与数据库列的映射,可以设置列名、长度、是否允许为空等属性。 - `@OneToMany`, `@ManyToOne`, `...
Spring Data JPA 是一个由 Spring 框架...这样,Spring Data JPA 将自动生成实现,提供对 Person 表的所有基本操作。通过这样的方式,开发者可以快速构建数据访问层,专注于业务逻辑,而不必过多关注底层的数据库操作。
7. JPA的事务管理,包括自动和手动事务模式。 8. 性能优化技巧,如批处理、懒加载和缓存策略。 总之,JPA是Java开发中处理数据库的强大工具,通过学习和掌握其API和注解的使用,开发者可以更加高效地进行数据持久化...
1. **自动映射**:JPA能自动将Java对象映射到数据库表,减少了手动编写SQL的繁琐工作。 2. **事务管理**:JPA支持声明式事务管理,简化了事务处理。 3. **懒加载和即时加载**:通过懒加载机制,可以优化性能,仅在...
只需要在接口上定义方法名,Spring Data JPA就能自动生成对应的SQL语句。例如,`findAll()`会执行SELECT ALL查询,`findByUsername(String username)`将生成一个根据用户名查找的查询。此外,`Pageable`接口可用于...
3. **Query Methods**:Spring Data JPA 支持通过方法名自动转换为 JPA 查询。例如,`findAll()` 会执行一个 SELECT ALL 查询,`findByLastname(String lastname)` 会根据指定的姓氏查找用户。此外,还可以使用注解 ...
在标题和描述中提到的"JPA_由数据库生成JavaBean",是指JPA提供的一项功能,即反向工程(Reverse Engineering),可以从现有的数据库模式自动生成对应的Java实体类,这些类通常被称为JavaBeans,因为它们遵循...