- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Spring Controller 方法的问题。它实际上对同一实体进行了两次更新,这会导致 StaleObjectStateException 。
问题是,当我检索 Member 实例时,我认为它会以某种方式导致 Advertisement 实例的更新(参见 //UPDATE ONE
)(这实际上并不需要),当我更新 Advertisement 实例(参见 //UPDATE TWO
)时,它会抛出一个 StaleObjectStateException 。
我的问题是如何防止在我的情况下发生此异常(请记住我使用的是 Spring Data JPA)?
这是 Member
实体类:
@Entity
public class Member {
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "member")
private List<Advertisement> advertisements;
...
Advertisement
实体类中:
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
private Member member;
@RequestMapping(value = "/family/advertisement/edit", method = RequestMethod.POST, produces = "text/html")
public String editFamilyAdvertisement(@ModelAttribute @Validated(value = Validation.AdvertisementCreation.class) FamilyAdvertisementInfo familyAdvertisementInfo, BindingResult bindingResult, Model model) {
Member member = memberService.retrieveCurrentMember();//UPDATE ONE
if (!advertisementService.advertisementBelongsToMember(familyAdvertisementInfo.getFamilyAdvertisement(), member)) {
throw new IllegalStateException("advertisement does not belong to member");
}
if (bindingResult.hasErrors()) {
populateModel(model, familyAdvertisementInfo);
return "family/advertisement/edit";
}
familyAdvertisementInfo.getFamilyAdvertisement().setMember(member);
advertisementService.editFamilyAdvertisement(familyAdvertisementInfo.getFamilyAdvertisement());//UPDATE TWO
return "redirect:/family/advertisement/edit/" + familyAdvertisementInfo.getFamilyAdvertisement().getId();
}
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.bignibou.domain.FamilyAdvertisement#1]
org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:303)
org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151)
org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:903)
org.hibernate.internal.SessionImpl.merge(SessionImpl.java:887)
org.hibernate.internal.SessionImpl.merge(SessionImpl.java:891)
org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:879)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366)
com.sun.proxy.$Proxy45.merge(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:241)
com.sun.proxy.$Proxy44.merge(Unknown Source)
org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:345)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:334)
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:319)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:91)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
com.sun.proxy.$Proxy52.save(Unknown Source)
com.bignibou.service.AdvertisementServiceImpl_Roo_Service.ajc$interMethod$com_bignibou_service_AdvertisementServiceImpl_Roo_Service$com_bignibou_service_AdvertisementServiceImpl$updateFamilyAdvertisement(AdvertisementServiceImpl_Roo_Service.aj:58)
com.bignibou.service.AdvertisementServiceImpl.updateFamilyAdvertisement(AdvertisementServiceImpl.java:1)
com.bignibou.service.AdvertisementServiceImpl_Roo_Service.ajc$interMethodDispatch1$com_bignibou_service_AdvertisementServiceImpl_Roo_Service$com_bignibou_service_AdvertisementServiceImpl$updateFamilyAdvertisement(AdvertisementServiceImpl_Roo_Service.aj)
com.bignibou.service.AdvertisementServiceImpl.editFamilyAdvertisement(AdvertisementServiceImpl.java:27)
com.bignibou.controller.AdvertisementController.editFamilyAdvertisement(AdvertisementController.java:85)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2013-04-06 11:23:24,339 [http-bio-8080-exec-9] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Returning handler method [public java.lang.String com.bignibou.controller.AdvertisementController.editFamilyAdvertisement(com.bignibou.controller.helpers.FamilyAdvertisementInfo,org.springframework.validation.BindingResult,org.springframework.ui.Model)]
Hibernate:
/* load com.bignibou.domain.GeolocationPostcode */ select
geolocatio0_.id as id8_0_,
geolocatio0_.postcode as postcode8_0_,
geolocatio0_.version as version8_0_
from
geolocation_postcode geolocatio0_
where
geolocatio0_.id=?
Hibernate:
/* load com.bignibou.domain.Member */ select
member0_.id as id6_1_,
member0_.activated as activated6_1_,
member0_.address as address6_1_,
member0_.email as email6_1_,
member0_.last_connection_date as last4_6_1_,
member0_.password as password6_1_,
member0_.registration_date as registra6_6_1_,
member0_.role as role6_1_,
member0_.token as token6_1_,
member0_.version as version6_1_,
address1_.id as id3_0_,
address1_.formatted_address as formatted2_3_0_,
address1_.latitude as latitude3_0_,
address1_.longitude as longitude3_0_,
address1_.version as version3_0_
from
member member0_
left outer join
address address1_
on member0_.address=address1_.id
where
member0_.id=?
Hibernate:
/* load one-to-many com.bignibou.domain.Member.advertisements */ select
advertisem0_.member as member6_1_,
advertisem0_.id as id0_1_,
advertisem0_.id as id0_0_,
advertisem0_.active as active0_0_,
advertisem0_.creation_date as creation3_0_0_,
advertisem0_.description as descript4_0_0_,
advertisem0_.expiration_date as expiration5_0_0_,
advertisem0_.member as member0_0_,
advertisem0_.validated as validated0_0_,
advertisem0_.version as version0_0_,
advertisem0_.childminder_status as childmin1_10_0_,
advertisem0_.clazz_ as clazz_0_
from
( select
id,
active,
creation_date,
description,
expiration_date,
validated,
version,
member,
null as childminder_status,
1 as clazz_
from
family_advertisement
union
select
id,
active,
creation_date,
description,
expiration_date,
validated,
version,
member,
childminder_status,
2 as clazz_
from
childminder_advertisement
) advertisem0_
where
advertisem0_.member=?
@RooJavaBean
@RooToString
@RooEquals
@RooJpaEntity(inheritanceType = "TABLE_PER_CLASS")
@Entity
@DynamicUpdate
public abstract class Advertisement {
@ElementCollection
private Set<ChildcareType> childcareTypes;
@ManyToMany
private List<DayToTimeSlot> dayToTimeSlots;
@NotNull(groups = { Validation.AdvertisementCreation.class })
@ManyToMany
private Set<GeolocationPostcode> postcodes;
@NotNull(groups = { Default.class })
@Size(min = 6, max = 300, groups = { Default.class, Validation.AdvertisementCreation.class })
@Column(length = 300)
private String description;
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm:ss")
private Date creationDate;
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm:ss")
private Date expirationDate;
@NotNull(groups = { Default.class })
private boolean active;
@NotNull(groups = { Default.class })
private boolean validated;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
private Member member;
public abstract boolean isChildcareTypesValid();
@AssertTrue(groups = { Validation.AdvertisementCreation.class })
public boolean isPostcodesValid() {
return (postcodes != null && !postcodes.isEmpty());
}
}
@RooJavaBean
@RooToString
@RooEquals
@RooJpaEntity
@Entity
@DynamicUpdate
public class FamilyAdvertisement extends Advertisement {
@NotNull(groups = Validation.AdvertisementCreation.class)
@ElementCollection
private Set<Need> needs;
@ElementCollection
private Set<ChildminderStatus> childminderStatuses;
@AssertTrue
@Override
public boolean isChildcareTypesValid() {
return true;
}
@AssertTrue
public boolean isNeedsValid() {
if (needs.isEmpty()) {
return false;
}
if (needs.contains(Need.CHILDMINDER_TO_FAMILY)) {
return false;
}
return true;
}
}
git clone https://github.com/balteo/sample-app-gab
。
最佳答案
我有一个类似的问题。这是我在运行 mvn test
时遇到的错误:
org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确)
这是因为我错误地将实体的 version
字段初始化为 NULL
:
mysql> select * from lap;
+----+-------------+---------------------+------+------------------+---------+---------+
| id | code | cumulative_distance | name | partial_distance | version | race_id |
+----+-------------+---------------------+------+------------------+---------+---------+
| 1 | AF0CUL00011 | 1000 | LAP1 | 1000 | NULL | 1 |
| 2 | AQ000000012 | 2000 | LAP2 | 1000 | NULL | 2 |
| 3 | AR000000013 | 3000 | LAP3 | 1000 | NULL | 3 |
| 4 | AR0000N0114 | 4000 | LAP4 | 1000 | NULL | 4 |
+----+-------------+---------------------+------+------------------+---------+---------+
4 rows in set (0.00 sec)
version
字段,一切正常:
mysql> select * from lap;
+----+-------------+---------------------+------+------------------+---------+---------+
| id | code | cumulative_distance | name | partial_distance | version | race_id |
+----+-------------+---------------------+------+------------------+---------+---------+
| 1 | AF0CUL00011 | 1000 | LAP1 | 1000 | 0 | 1 |
| 2 | AQ000000012 | 2000 | LAP2 | 1000 | 0 | 2 |
| 3 | AR000000013 | 3000 | LAP3 | 1000 | 0 | 3 |
| 4 | AR0000N0114 | 4000 | LAP4 | 1000 | 0 | 4 |
+----+-------------+---------------------+------+------------------+---------+---------+
4 rows in set (0.00 sec)
关于spring - 防止 hibernate StaleObjectStateException 发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15795819/
我有一个应用程序,其中许多对象都扩展了一个抽象类,该抽象类定义了诸如 create() edit() retrieve() 和 delete()。由于每个子类对这些函数使用相同的逻辑,抽象类定义了默认
我正在使用$anchorScroll滚动到页面顶部,其中 html 元素具有 ID #brand。 AngularJS 代码: $location.hash(
我想停用我的应用程序中的右键单击,该右键单击提供了在桌面上安装应用程序的选项。我该如何做这样的事情? 最佳答案 右键单击 Visual Studio 中的项目并选择属性。那里有一个复选框“启用浏览器运
我使用 jquery 定位 div,在我的 CSS 中我有一个 div.right-sm:hover{background-color: blue} 我想使用 jquery 停止悬停: $(this
所以,我正在尝试复制 html5“占位符”属性功能。 我目前坚持的一件事是,在获得元素焦点时,插入符号立即出现在输入的开头。 就目前情况而言,插入符号出现在用户单击的位置,然后当我使用 jQuery
当表单填写并发送时,如果您刷新页面,它表示表单将再次发送。 (再次提交表格)。 防止这种情况发生的好方法是什么?或者终止这个 session ? 这方面有什么指导吗? 谢谢 最佳答案 处理完POST信
我想阻止 @ 被输入到 input 中。但它不起作用,知道为什么吗? $(function() { $(document).on('keyup', '[placeholder="x"]', fun
我正在使用 PHP 创建一个应用程序并涉及 MySQL。如果在请求过程中发生错误,我将如何“将查询分组在一起”,检查它是否会成功,然后对真实表进行实际影响。如果对表的实际更新失败,则恢复到更新之前的状
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Best Java obfuscator ? 对于我的示例,我知道 eclipse 提供了一个反编译插件。而
这是一个演示我的问题的 fiddle :JSFiddle 我正在制作自定义下拉菜单(实际上我使用的是 icomoon 图标而不是 V)...它看起来不错,但是父元素的 ::after 是阻止选择:(
每当我编写需要大量条件的代码时,我都会这样做: if foo: if bar: if foobar: if barfoo: if foobarfoo:
我不确定术语是否正确,您可以使用哪些代码实践来使某人难以修改二进制文件/程序集以绕过检查: 例如在源代码中。 bool verificationResult = verify(); if (verif
我正在寻找一种简单的方法来检查多个零件表,以确定给定零件号在添加到给定表之前是否已经存在。 我目前想到的最好的想法是一个辅助表,它简单地将所有表中的每个 PN 列在一个列中,并带有一个唯一的键;但是我
这个问题在这里已经有了答案: jquery stop child triggering parent event (7 个答案) 关闭 8 年前。 我不确定这是否真的冒泡,我会解释。 我有这个:
我有一个 Spring MVC web 应用程序(不确定该信息是否重要,但它可能是)使用 ModelAndView 将字符串值传递给 JSP 文件。 字符串值的形式是: d@.
我在这里尝试使用表单 key 方法进行 csrf 保护 http://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/
htmlentities 是防止 PHP 中的 XSS 的最佳解决方案吗?我还想允许像 b、i、a 和 img 这样的简单标签。实现这一点的最佳解决方案是什么?我确实考虑过 bbcode,但发现如果没
我有一个非常基本的 JAX-RS 服务(下面的 BookService 类),它允许创建 Book 类型的实体(也在下面)。 POST负载 { "acquisitionDate": 14188
我正在使用 Polymer 1.5,我确实需要“this”变量不要映射到外部。我知道 typescript 会为某些人做这件事 valid reasons . declare var Polymer:
这个问题在这里已经有了答案: Class-level read-only properties in Python (3 个答案) 关闭 6 年前。 有没有一种方法可以通过重写实例变量的 __set
我是一名优秀的程序员,十分优秀!