防止在hibernate中注册重复的序列号

时间:2013-10-13 01:50:05

标签: hibernate concurrency locking

我已经创建了一个网络应用程序,我将在其中提交一个表格,其中将生成一个序列号,提交序列号应仅提供给一个注册,如果两个申请提交在非常相同的情况下,有可能获得两次注册的重复序列号。

我已经编写了如下所示的代码,我们可以使用此代码防止上述问题,请对此提出有价值的建议。

public String registration(){

    Session session = factory.openSession();
    Transaction t = null;
    try {
    t = session.beginTransaction();

    TableSerialGenerator serialnoObj;
    serialnoObj=generateSerialNo("1", session);
    String Serial_No=serialnoObj.getPrefix()+"-"+serialnoObj.getCurrentIndex();

    Registration res=new Registration(Serial_No,......);
    session.save(res);

    t.commit();
    return SUCCESS;
    }
    catch (RuntimeException e) {
    if(t!= null)
             t.rollback();
    return ERROR;
    }
    finally {
    session.close();
    }
}


public TableSerialGenerator generateSerialNo(String type,Session session)
{
String serialno="";
TableSerialGenerator obj=new TableSerialGenerator();
try
{

    obj=(TableSerialGenerator) session.get(TableSerialGenerator.class, Integer.parseInt(type), LockMode.UPGRADE);

    if(obj.getCurrentIndex() == null)
    {
      obj.setCurrentIndex(obj.getStartIndex());
    }
    else
    {
      obj.setCurrentIndex(obj.getCurrentIndex()+1);
    }
    session.save(obj);

    }
    catch(Exception e)
    {
        System.out.println("Exception in generateSerialNo method of CommonHibernateClass class....."+e);
         e.printStackTrace();
    }

    return obj;
}

TableSerialGenerator.java

public class TableSerialGenerator  implements java.io.Serializable {


     private Integer id;

     private String prefix;
     private String suffix;
     private Integer startIndex;
     private String type;
     private Integer currentIndex;
     private String status;
     private Date createdDate;
     private Date modifiedDate;

//getters and setters

}

1 个答案:

答案 0 :(得分:0)

为了避免可能的多线程问题,您可以在获取序列号“generateSerialNo”的方法中使用syncronized关键字,这样可以避免两次获得相同的序列号。 但是,如果你想使用表考虑使用@TableGenerator,你可以使用JPA中的策略来获取新的序列值。

@TableGenerator(
            name="empGen", 
            table="ID_GEN", 
            pkColumnName="GEN_KEY", 
            valueColumnName="GEN_VALUE", 
            pkColumnValue="EMP_ID", 
            allocationSize=1)
        @Id
        @GeneratedValue(strategy=TABLE, generator="empGen")
        int id;

这将在特定实体的每个保存操作中创建一个新的序列号。

TableGenerator API