当前位置: 首页 > 知识库问答 >
问题:

Hibernate序列停留在值41

经慈
2023-03-14

在我的课堂上,我有以下的顺序-

@Entity
public class CustomerOrder {

   @Id
   @SequenceGenerator( name = "CUSTOMER_ORDER_INVOICE_NO_SEQ_NAME", sequenceName = "CUSTOMER_ORDER_INVOICE_NO_SEQ", allocationSize = 20 )
   @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "CUSTOMER_ORDER_INVOICE_NO_SEQ_NAME" )
   private int id;

   private long orderInvoiceNo;

   //.. getters and setters

}

这是spring data jpa repository类,具有获取下一个值的方法

  @Repository
  public interface CustomerOrderRepository
    extends CrudRepository<CustomerOrder, Long>, JpaSpecificationExecutor<CustomerOrder> {

     @Query( value = "SELECT next_val FROM CUSTOMER_ORDER_INVOICE_NO_SEQ", nativeQuery = true )
     Long getNextOrderInvoiceNoSeq();
 }

我需要从序列中获取next_val,并将该值传递到两个不同的位置。所以我调用我的存储库的getNextOrderInvoiceNoSeq()方法,并将该值存储为orderInvoiceNo-

@Autowired
private CustomerOrderRepository customerOrderRepository;

public void placeCustomerOrder( CustomerOrder customerOrder )
{

 long orderInvoiceNo = customerOrderRepository.getNextOrderInvoiceNoSeq();
 customerOrder.setOrderInvoiceNo(orderInvoiceNo);

 // using the same orderInvoiceNo to my other pojo
 // CustomerPurchase customerPurchase = new CustomerPurchase
 // customerPurchase.setOrderInvoiceNo(orderInvoiceNo);

 //....
 customerOrderRepository.save(customerOrder);
}


 @Entity
 public class CustomerPurchase {

   private String itemId;
   private long orderInvoiceNo;
   //.....     
 }

所以现在发生了什么,对于放置客户订单的前两次迭代,我得到的订单发票号为1和41,但在那之后,每次我得到41作为序列的next_val,因此使每个订单都有相同的发票号为41。

共有1个答案

萧浩漫
2023-03-14

MySQL没有序列,所以在本例中Hibernate将创建一个表生成器。

Hibernate将执行选择更新以获取最新的下一个值,并执行更新以增加值:

SELECT next_val as id_val 
FROM CUSTOMER_ORDER_INVOICE_NO_SEQ FOR UPDATE

UPDATE CUSTOMER_ORDER_INVOICE_NO_SEQ 
SET next_val= 2 where next_val=1

getNextOrderInvoiceNoSeq()只为最新值选择,但不增加它。

尽管如此,我不建议实施这一点。最好切换到本机序列,并使用外键CustomerOrder和CustomerPurchase。

 类似资料:
  • 问题内容: 我有一个清单 并希望“移动”其值,以便将其更改为 下一步 Python中是否有内置函数可以做到这一点? 还是有比这更好或更短的方法 问题答案: a = [1,2,3,4,5] >>> a.append(a.pop(0)) >>> a [2, 3, 4, 5, 1] 但是,这很昂贵,因为它必须移动整个列表的内容,即O(n)。如果在您的Python版本中可用,则可能是一个更好的选择,它允许

  • 问题内容: 我尝试在spring版本的项目中将hibernate模式从4升级到5 。升级之后,调用更新方法时,在堆栈跟踪中发现以下错误。 我用注解更改了自动递增的ID 错误仍然存​​在。 问题答案: 您需要设置Hibernate5.x ..参见并链接。 对于较早版本的hibernate 4.x:

  • 用这个来清理它: 进程应该退出还是留在内存中?如果它应该留在内存中,在Windows7任务管理器中可见,我可以用编程方式杀死它吗?我应该吗?

  • 问题内容: 我似乎在Hibernate中映射列表时遇到问题。在我们的项目中有一类用含有类与含有。 Hibernate 是否可以使用注释进行映射?我的意思是,因为它没有注释? 问候 问题答案: 用途: 资料来源: 7.2.3。基本类型和可嵌入对象的集合

  • 正如标题所示,我使用上面的堆栈来深入了解一段时间内特定方法调用的频率。 这是如何在代码中设置收集指标的: 这是Grafana中图形的配置方式: 这就是结果图的样子: 如您所见,当没有方法调用时,该行将停留在最新值。当我停止应用程序时,有几次下降到0(在开始时两个大的“驼峰”之后,在结束时又下降了一个)。 在最后一个标记过了一段时间后,行不应该降到0吗?E、 g.应用程序启动后,会发生几个方法调用,

  • 我试图创建一个回归模型,但我的验证精度保持在。我试图训练图像,让网络找到一个物体的位置和它覆盖的粗糙区域。我增加了解冻层和精度的平台下降到。如果能帮我找出我做错了什么,我将不胜感激。 数据是由一个包含图像数据和一些标签的tf记录文件生成的。这是发电机的最后一点。 获取批处理:数据集从两个目录加载,其中包含tfrecord文件,一个用于培训,另一个用于验证 1月1/1000/1000 1000/10