java OpenJPA二级缓存不缓存相关对象
我有一个简单的数据模型,它由一个父对象和一系列子对象之间的一对多关系组成
@Entity
public class Client implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.ALL)
private List<Session> sessions;
...
}
@Entity
public class Session implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 200)
private String location;
...
}
我已经在持久化中使用OpenJpa启用了二级缓存。xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="puOpenJPA_Gym" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>java:jboss/datasources/GymTracker</jta-data-source>
<class>za.co.blacklemon.entities.Client</class>
<class>za.co.blacklemon.entities.Session</class>
<shared-cache-mode>ALL</shared-cache-mode>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
<property name="jboss.as.jpa.providerModule" value="org.apache.openjpa"/>
<property name="openjpa.DynamicEnhancementAgent" value="false"/>
<property name="openjpa.Log" value="File=stdout, DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.QueryCache" value="true(CacheSize=10000, SoftReferenceSize=1000)"/>
<property name="openjpa.DataCache" value="true(CacheSize=20000, SoftReferenceSize=1000)"/>
</properties>
</persistence-unit>
</persistence>
然后,我通过调用find,然后访问会话列表来获取各个客户机。这里的第二行触发OpenJPA从DB填充子对象:
Client client = dao.find(Client.class, id);
System.out.println(client.getSessions().size());
第一次运行时,日志中会出现两个查询,一个用于父对象,另一个用于任何子对象:
executing prepstmnt 782097742 SELECT t0.contactNumber, t0.description, t0.firstName, t0.photo, t0.surname FROM Client t0 WHERE t0.id = ? [params=?]
executing prepstmnt 626498798 SELECT t1.id, t1.location FROM Client_Session t0 INNER JOIN Session t1 ON t0.SESSIONS_ID = t1.id WHERE t0.CLIENT_ID = ? [params=?]
第二次运行时,当从缓存中检索对象时,初始查询消失,但第二次(可能更多)查询仍在执行
为什么OpenJPA不在缓存中以一对多的关系存储子对象
我在Java7上使用OpenJPA2.3.0
# 1 楼答案
OpenJPA存储子对象,但不会将FK存储回父对象。我通过OPENJPA-2285在OpenJPA主干(2.4.x)中修复了这个问题