Java 在同一台机器上的两个jvm中,两个单独的hibernate是否会混淆并使用相同的ehcache文件

Java 在同一台机器上的两个jvm中,两个单独的hibernate是否会混淆并使用相同的ehcache文件,java,hibernate,jpa,hibernate-mapping,ehcache,Java,Hibernate,Jpa,Hibernate Mapping,Ehcache,我有两个独立的Hibernate实例在同一台物理机器上的两个不同jvm中运行 两个hibernate都使用相同的ehcache.xml设置文件,并且两个hibernate jvm都使用一个公共类,如: @Entity class Parent { @OneToMany(mappedBy="parent") @Cache(region = "myCache", usage = CacheConcurrencyStrategy.READ_WRITE) private List<

我有两个独立的Hibernate实例在同一台物理机器上的两个不同jvm中运行

两个hibernate都使用相同的ehcache.xml设置文件,并且两个hibernate jvm都使用一个公共类,如:

@Entity
class Parent {
   @OneToMany(mappedBy="parent")
   @Cache(region = "myCache", usage = CacheConcurrencyStrategy.READ_WRITE)
   private List<Children> childrens;
}
现在如果进程A [0]启动事务

[1] 读取父对象,然后

[2] 读取集合中的所有子对象,从而将子对象放在hibernate的ehcache的mycache区域中,从而使inmemory对象计数为full,并将溢出的子对象保存到磁盘,并将文件保存在myCahce.data中

[3] 然后进程A从集合中删除子对象

[4] 交易完成

另一个进程B在获得事务完成消息后,读取父对象,现在如果我们尝试运行parent.getChildren,我将获得

org.hibernate.ObjectNotFoundException: No row with the given identifier exists[my.package.class.entity#3218]
这意味着进程B hibernate确实从某处获得了子对象标识符值,但当它实际尝试从db加载对象时,却找不到它

理想情况下,它不应该获得标识符值

问题:

这是因为两个hibernate实例都使用相同的myCache.data,并且由于DiskExpireythReadIntervalSeconds=120,文件缓存中的对象直到120秒才会启用脏标志

因此进程B最终从缓存文件加载集合对象的ID,但是当它实际尝试从db加载时,它没有找到行,因此抛出错误

系统详细信息:

<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.2.2.Final</version>

<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.2.Final</version>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.2.2.Final</version>

<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.2.Final</version>