Java 使用Hibernate处理数据库中多对一关系中实体并发创建的最佳方法

Java 使用Hibernate处理数据库中多对一关系中实体并发创建的最佳方法,java,database,hibernate,concurrency,Java,Database,Hibernate,Concurrency,假设我们有实体A和B,让A和B之间的关系是多对1。我们从队列中读取消息,并尝试在数据库中创建a和B。每条消息都包含关于A和B的信息。如果我们有: A1和B1的消息 A2和B1的消息 我们希望在表A中创建A1和A2,在表B中创建B1,并在表A中创建指向B1的外键,即。 A1->B1 A2->B1 这些消息同时被使用,即thread1处理A1和B1的创建,而thread2处理A2的创建。假设我们有标准来确定B1是否存在于表B中 Thread1和Thread2将同时发现B1缺失。他们都将尝试创建B1。

假设我们有实体A和B,让A和B之间的关系是多对1。我们从队列中读取消息,并尝试在数据库中创建a和B。每条消息都包含关于A和B的信息。如果我们有:

  • A1和B1的消息
  • A2和B1的消息
  • 我们希望在表A中创建A1和A2,在表B中创建B1,并在表A中创建指向B1的外键,即。 A1->B1 A2->B1

    这些消息同时被使用,即thread1处理A1和B1的创建,而thread2处理A2的创建。假设我们有标准来确定B1是否存在于表B中

    Thread1和Thread2将同时发现B1缺失。他们都将尝试创建B1。但只有一个线程必须成功。第二个线程必须失败或等待

    你认为处理这样一个问题最好、最有效的方法是什么?其中一个线程如何尽快发现B1已创建,并失败或等待B1的创建


    我们在客户机-服务器应用程序中使用Hibernate进行持久化。

    如果创建A2的线程也创建B1,而另一个线程只链接A1和B1,是否可以?如果是这样,我可能会尝试创建B1并让Hibernate直接或至少在事务结束时刷新语句(即实际执行它们)。然后捕获“重复条目”异常(您需要一个合理的唯一约束),并在另一个事务中重试。您是否在同一事务中创建A2取决于您的需求和环境。创建A2的线程2也可能尝试创建B1。然后,如果在thread1事务之后执行tread2事务,它将由于唯一约束而失败。但是如果thread2有很多繁重的计算要做,那么如果thread2能够尽早失败就好了。这是我发现很难做到的“尽早”部分,可能是因为我刚刚开始冬眠。我想学习堆栈溢出用户的集体智慧。也许他们知道一些我不知道的聪明的事情。好吧,你可以尝试在单独的事务中创建B和A(或更短的:tx)。在第一次发送中,您可以尝试获取对B的引用,如果失败,您可以尝试创建它。如果由于重复的异常而失败,那么另一个线程可能会更快,所以再次尝试获取对B的引用。如果您获得了引用,您将结束第一次发送,并开始一个新的发送,以进行繁重的计算,并创建一个-您可以在a实例中设置之前获得的B引用(或使用B实例的ID)以建立连接。谢谢您,托马斯,这非常有用!