我有两个REST API,可以修改同一个表的两个不同行中的值。
有时会同时调用这两个API。问题是,当第二个API完成修改表时,它将覆盖第一个API所做的任何更改。
表格为Contact
,其行如下所示:
Name | Email |Phone
Admin x | x@y.com | 123
Tech. y | y@x.com | 456
当两个API完成后,我最终得到如下表格:
Name | Email |Phone
Admin xNew | xNew@y.com | 123
Tech. y | y@x.com | 456
或有时
Name | Email |Phone
Admin x | x@y.com | 123
Tech. yNew | yNew@x.com | 456
我丢失了其中一项更新
我必须提供单独的API来更新Admin。和科技。联系人。 (如果是单个API,则不会出现问题)
现在我已经通过同步(Java)对读取和更新对象(以及数据库表)中的值的方法的调用来解决了这个问题
执行更新的Method的伪代码是:
void saveContactData(adminContact, techContact, orgID){
Organzation org = getOrgDao().findByID(orgID);
if (adminContact != null)
org.setAdmin(contact);
else if (techContact != null)
org.setTech(contact);
getOrgDao().saveorUpdate(org);
}
但我觉得Hibernate应该有一些东西可以解决这个问题。我探索了 HibernateLockStrategy ,但它似乎锁定了单个记录而不是完整的表。
HBM映射是:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Contact" table="CONTACT" schema="public" lazy="false">
<id name="id" type="long">
<column name="ID" />
<generator class="native">
<param name="sequence">contact_id_seq</param>
</generator>
</id>
<property name="name" type="string" column="CONTACT_NAME"/>
<property name="email" type="string" column="EMAIL"/>
<property name="phone" type="string" column="PHONE"/>
<property name="cellPhone" type="string" column="CELL_PHONE"/>
</class>
</hibernate-mapping>
在组织dao中:
@JoinColumn(name = "admin")
@ManyToOne(cascade = CascadeType.ALL)
private Contact admin;
@JoinColumn(name = "tech")
@ManyToOne(cascade = CascadeType.ALL)
private Contact tech;
注意: