Java 休眠以获取最大id并将其存储在内存中

Java 休眠以获取最大id并将其存储在内存中,java,spring,hibernate,Java,Spring,Hibernate,我不熟悉使用hibernate。我已经编写了以下代码来获取订单表中的max id public int getOrderMaxUID() { Session session = sessionFactory.getCurrentSession(); String query = "SELECT max(o.UID) FROM Order o"; List list = session.createQuery(query).list(); int maxO

我不熟悉使用hibernate。我已经编写了以下代码来获取订单表中的max id

 public int getOrderMaxUID() {
     Session session = sessionFactory.getCurrentSession();
     String query = "SELECT max(o.UID) FROM Order o";
     List list = session.createQuery(query).list();
     int maxOrderUID = ((Integer) list.get(0)).intValue();

     return maxOrderUID;
 }
在向表中添加新记录之前,我在控制器中调用此方法

orderService.getOrderMaxUID();
orderService.add(o);
问题:记录也通过其他流程添加到我们的订单表中。因此,为了避免重复的PK问题,我在插入记录之前从订单表中获取最大id。但当其他进程添加记录时,我仍然会遇到以下错误

2013-04-04 09:27:24,841 WARN  ["ajp-bio-8009"-exec-2]     org.hibernate.util.JDBCExceptionReporter - SQL Error: 2627, SQLState: S1000
2013-04-04 09:27:24,841 ERROR ["ajp-bio-8009"-exec-2]     org.hibernate.util.JDBCExceptionReporter - Violation of PRIMARY KEY constraint 'PK_Order'.     Cannot insert duplicate key in object 'Order'. The duplicate key value is (1001508).

我希望hibernate将getMaxOrderId方法检索到的id存储在内存中,并在添加新记录时使用下一个数字。
在此方面的任何帮助都将不胜感激。

为什么不让Hibernate为您生成ID呢

/** The id. */
@Id @GeneratedValue
private Long id;
编辑:

您可以从多个进程创建条目,只要您通过hibernate进行创建,id将相应地进行调整

但是,在hibernate之外插入数据库会导致问题。您可以使用客户ID生成器来解决此问题

如果在hibernate之外编辑数据库,可能还会遇到其他问题,尤其是在使用二级缓存的情况下


如果使用相同的会话,您也会遇到由一级缓存引起的问题。

愚蠢的问题:您是增加最大id还是至少为新实体使用新id?我这里没有足够的上下文。。。您能否在控制器中提供该方法?它是否仅在多个进程中失败,甚至在单个进程中失败?进程线程叫什么?我确实使用@GeneratedValue自动生成id,但如果另一个进程在数据库表中输入记录或在表中手动输入记录,然后hibernate尝试添加记录,则PK已经存在,因此引发异常。这就是编写getMaxOrder方法的目的,但是没有得到预期的结果。我使用了自定义生成器,现在它确实可以为我工作了。谢谢你的帮助,无人机。
/** The id. */
@Id @GeneratedValue
private Long id;