我已经创建了一个网络应用程序,我将在其中提交一个表格,其中将生成一个序列号,提交序列号应仅提供给一个注册,如果两个申请提交在非常相同的情况下,有可能获得两次注册的重复序列号。
我已经编写了如下所示的代码,我们可以使用此代码防止上述问题,请对此提出有价值的建议。
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
}
答案 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;
这将在特定实体的每个保存操作中创建一个新的序列号。