【发布时间】:2013-03-21 08:14:21
【问题描述】:
我正在开发一个带有 spring 数据和休眠的 spring mvc webapp。
我有一个由布尔字段和整数字段组成的实体。
一开始,布尔字段为假,整数字段为空。
当布尔字段变为真时,我需要为整数字段分配一个等于 MAX(seq) +1 的唯一值
为此,我这样写我的服务方法:
@Override
public synchronized Obj save(Obj entry) {
if (entry.getBool() && entry.getSeq() == null){
Integer seq = objRepository.getLastSeq();
if (seq == null){
seq = 1;
}
entry.setSeq(seq);
}
return entry.save(entry);
}
在我的存储库中:
@Query("select MAX(seq)+1 FROM Obj")
Integer getLastSeq();
我将同步关键字放在服务方法中,以确保一次只有一个线程可以获得唯一的 MAX+1 数字。但我不确定它是否适用于所有情况以及是否正确方式。
我能确定它保证seq的唯一性吗?
谢谢 马可
【问题讨论】:
-
只有英国到
seq专栏才能保证您的唯一性。 -
我无法将其设置为 UK,因为某些实体必须具有整数值 null。只有当布尔值变为真时,整数才变为非空!
-
好的,用户可以直接调用
obj.setSeq()吗? -
No.. 它以隐藏的输入类型传入和传出视图。
-
在方法上同步基本上是在“this”上同步,在你的例子中是服务类。尽管我通常不喜欢这样做,但您实际上是在说只有一个线程将为您的服务类的每个实例执行该方法。如果保证您只存在一个服务类副本,那么我相信您没问题。但是,如果您有多个应用程序服务器,每个都有自己的副本,或者您正在创建对服务对象的多个引用,那么您不是。
标签: spring hibernate jpa spring-mvc spring-data