-1

我是使用休眠的新手。我编写了以下代码在我的订单表中获取最大 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).

org.springframework.dao.DuplicateKeyException: Hibernate flushing: could not insert:

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

4

1 回答 1

3

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

/** The id. */
@Id @GeneratedValue
private Long id;

编辑:

只要您通过休眠进行,您就可以从多个进程创建条目,并且ID将相应调整。

但是,在休眠之外插入数据库会导致问题。您可以使用客户 ID 生成器来解决此问题。我发现这个例子可能会有所帮助

如果您在休眠之外编辑数据库,您也可能会遇到其他问题(尤其是如果您使用二级缓存)

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

于 2013-04-04T15:01:56.087 回答