簡體   English   中英

OpenJPA L2緩存未緩存相關對象

[英]OpenJPA L2 Cache not caching related objects

我有一個簡單的數據模型,該模型包含一個父對象,該對象與子對象列表具有一對多的關系。

@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;
...
}

我在persistence.xml中使用OpenJpa啟用了L2緩存:

<?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從數據庫填充子對象:

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不能以一對多關系將子對象存儲在緩存中?

我在Java 7上使用OpenJPA 2.3.0。

為什么OpenJPA不能以一對多關系將子對象存儲在緩存中?

OpenJPA存儲子對象,但不會將FK存儲回父對象。 我通過OPENJPA-2285在OpenJPA干線(2.4.x)中解決了此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM