2013-02-27 45 views
1

我正在使用Hibernate。服务作为web服务公开。这项服务将由2个应用程序调用。该服务方法将记录保存到数据库中。使用hibernate的主键违规问题?

ServiceClass.java: 
------------------ 

//Here Transaction will start 
public void saveRecord(SampleEntity entity){ 

someDAO.saveData(entity); 

} 


SomeDao.java 
----------------- 

public void saveData(SampleEntity entity){ 
    //record is saved using saveOrUpdate method 
} 

如果saveRecord方法由两个应用at a time与相同的ID调用,PK violation exception被抛出。

这两个应用程序都在发送具有相同ID的记录。

因为我们正在使用saveOrUpdate它应该更新记录,如果它已经存在。

+0

您必须从数据库获取现有实体并更新其值。如果它不存在(hibernate返回null),那么你创建它。 – DominikM 2013-02-27 11:03:30

+1

你是手动设置ID还是由Hibernate生成? – overmeulen 2013-02-27 11:05:57

+0

我们做同样的事情,但没有用。我的直觉是,应用程序调用一个实体传递存储方法,但在将记录保存到数据库之前,第二个应用程序也会打电话保存。由于应用程序尚未插入记录,所以显然DB不会有记录。 – user1016403 2013-02-27 11:06:09

回答

1

如果这是在一个事务中,该行将被锁定(并且索引未更新),直到事务提交。因此,如果更新发生在提交之前,它可能看起来像两个具有相同PK的插入。

+0

感谢您的回复!是....任何推荐的解决方案? – user1016403 2013-02-27 14:55:37

+0

很大程度上取决于您的应用程序的布局。一种想法是将逻辑放入仲裁存储的保存服务类(确保在更新触发前完成)。或者把实际的保存放在这样做的门面之后(可能更干净)。你可以做一些事情,比如在进程中保存一张PK的静态地图(在路上添加和清除)。可能想要一个同步的地图或块在这里使这个模糊的安全。 – WPrecht 2013-02-27 16:18:39