java - JPA/Hibernate 实体类和同步的最佳实践是什么?

标签 java multithreading hibernate jpa

我见过的大多数 JPA/Hibernate 实体 bean 类示例似乎都没有显式同步。然而,可以在构建事务的上下文中调用这些对象的 getter/setter。并且可以跨多个线程调用这些方法(尽管这可能不寻常且奇怪)。

似乎如果它是跨多个线程构建的,那么对象状态的更改可能会丢失,这将是令人遗憾的。

那么,忽略同步是最佳实践吗? Hibernate 检测代码是否会为我处理正确的同步?

举个例子:

@Entity
public class Ninja {
  @Id @GeneratedValue
  private Long id;

  @Column 
  private String name;

  @Column
  private int throwingStars;

  public Ninja() {}
  public int getThrowingStars() { return throwingStars; } 
  public void addThrowingStar() { throwingStars += 1; }
}

throw 星方法需要同步吗?我当然不希望我的忍者失去任何飞镖。

最佳答案

在我看来,你永远不应该跨线程共享域对象。事实上,我通常在线程之间共享很少的数据,因为必须保护此类数据。我已经构建了一些大型/高性能系统,并且从未违反过这条规则。如果您需要并行化工作,那么可以这样做,但不要通过共享域对象的实例来实现。每个线程都应该从数据库读取数据,通过改变/创建对象来对其进行操作,然后提交/回滚事务。工作传入/传出通常应该是值/只读对象。

关于java - JPA/Hibernate 实体类和同步的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/183629/

相关文章:

java servlet url 映射不起作用

java - jackson 对象数组

Spring Boot JPA 过滤器按连接表

java - 没有字段的派生类的 Hibernate 映射

java - "Could not write JSON: failed to lazily initialize a collection of role"带 springboot 和 hibernate 搜索

java - 我在 Java 中的快速排序实现仅对数组的一部分进行排序。不确定为什么要这样做

java - Junit异常测试

c++ - 在函数周围调用std::thread()的工作方式不同

java - Jboss Java EE 容器和一个 ExecutorService

c - 如何并发运行非线程安全的代码?