更新前的Hibernate锁表

时间:2015-11-02 05:47:01

标签: java hibernate postgresql

我有两个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;

注意:

  1. 数据库 postgres
  2. 我是一个休眠的n00b

0 个答案:

没有答案