2013-03-21 73 views
1

我正在开发弹簧数据和休眠的弹簧mvc webapp。保证与弹簧数据和休眠的唯一编号生成

我有一个由布尔型字段和整数字段组成的实体。

开始布尔字段为false,整数字段为空。

当布尔领域成为真正的我需要分配到整型字段的唯一值等于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); 
} 

在我Reposiroty:

@Query("select MAX(seq)+1 FROM Obj") 
Integer getLastSeq(); 

我把synchronized关键字服务方法,以确保每次仅一个线程可以得到一个独特的MAX + 1个..但我不知道,如果它适用于所有情况,如果它是正确的。

我可以确定它确保seq的唯一性吗?

谢谢 马尔科

+0

只有英国到'seq'专栏才能保证你的独特性。 – user1516873 2013-03-21 08:34:13

+0

我无法将其设置为UK,因为某些实体必须具有整数值null。只有当布尔变成真时,整数才变为非空! – gipinani 2013-03-21 08:37:38

+0

好的,用户可以明确地调用'obj.setSeq()'? – user1516873 2013-03-21 08:46:15

回答

1

示例使用如何为目的的初始化豆。

@Service 
public class SequenceInitializer implements InitializingBean{ 

    @Autowired 
    private ObjRepository objRepository; 

    @Autowired 
    private Service service; 

    @Override 
    public void afterPropertiesSet() throws Exception { 

     try { 
      Integer max = objRepository.getLastSeq(); 
      service.setLastSeq(max); 
     } catch(Exception e){...} 

} 

在您的服务setLastSeq将设置AtomicInteger字段。

+0

我不明白这种方法对我的情况是否有用。如果在尝试创建实体并将其保存为布尔值false(因此整数为空),它可以工作吗?然后我更新实体设置布尔真(所以integer = maxValue +1)? – gipinani 2013-03-21 10:03:35

+0

所以让我们清楚。如果某些条件为真,您希望有一个保存naxt整数值的字段。在您的解决方案中,每次保存实体时都会对数据库进行额外的查询(这不是个好主意)。在上面的解决方案中,您只在应用程序启动时只进行一次查询,并将最大值写入服务中的AtomicInteger字段。现在,当下一次调用save方法时,您可以从atiomicInteger..getAndIncrement()获取下一个整数值。该解决方案速度更快,并且同步块已停用。 – Damian0o 2013-03-21 10:09:56

+0

在保存..或更新。 – gipinani 2013-03-21 10:30:53

2

好像你Integer是条目号或不是吗?那么,为什么不使用数据库的序列,@id adnotation例如:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id") 
private Long id; 
+0

不..它不是实体ID。是一个整数,仅适用于布尔运算变为true的实体。为了更加可靠,这个实体代表一个考试..我只有在我顺利通过考试时才给出序列号!感谢您的回答 – gipinani 2013-03-21 08:35:32

+0

因此,请在回答[this](http://stackoverflow.com/questions/277630/hibernate-jpa-sequence-non-id)问题时检查此解决方法。 – Damian0o 2013-03-21 08:49:12

+0

Meybe更好的解决方法是向您的服务添加初始化bean接口,并检查表中的最大序列号,然后在保存方法中使用AtomicInteger。每次你想要查询数据库女巫的下一个整数都不是最佳解决方案。 – Damian0o 2013-03-21 08:57:09