Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加载带有数据库表值的Bean,并使用JPA二级缓存使其可缓存_Java_Jpa_Caching_Eclipselink - Fatal编程技术网

Java 加载带有数据库表值的Bean,并使用JPA二级缓存使其可缓存

Java 加载带有数据库表值的Bean,并使用JPA二级缓存使其可缓存,java,jpa,caching,eclipselink,Java,Jpa,Caching,Eclipselink,我需要将数据库记录缓存到应用程序中,并在整个应用程序中使用它。我不明白如何使我的实体类可缓存。我在某个地方读到,为了使实体类可缓存,我们需要提交,但在我的例子中,我在数据库中预先存储了配置数据,这些配置数据可能很少更改,我们不会从类中持久化它 我在下面张贴我的代码,我试图达到上述要求 下面是我的bean类: @Entity(name="ActCodeMetadataBean") @Table(name="ACT_CODE_MTDT") @Cacheable(true) public class

我需要将数据库记录缓存到应用程序中,并在整个应用程序中使用它。我不明白如何使我的实体类可缓存。我在某个地方读到,为了使实体类可缓存,我们需要提交,但在我的例子中,我在数据库中预先存储了配置数据,这些配置数据可能很少更改,我们不会从类中持久化它

我在下面张贴我的代码,我试图达到上述要求

下面是我的bean类:

@Entity(name="ActCodeMetadataBean")
@Table(name="ACT_CODE_MTDT")
@Cacheable(true)
public class ActCodeMetadataBean {



    @Id
    private String ACT_CODE;
    private String PRDT_ID;
    private String ACT_ACTN;
    private String ACT_EXEC_ORDR;
    private String RQST_STRC_ID;

    @Temporal(TemporalType.DATE)
    private Date CRTN_DATE;
    @Temporal(TemporalType.DATE)
    private Date LAST_UPDT_DATE;

 public ActCodeMetadataBean() {
        super();
        // TODO Auto-generated constructor stub
    }

public String getACT_CODE() {
    return ACT_CODE;
}

public void setACT_CODE(String aCT_CODE) {
    ACT_CODE = aCT_CODE;
}

public String getPRDT_ID() {
    return PRDT_ID;
}

public void setPRDT_ID(String pRDT_ID) {
    PRDT_ID = pRDT_ID;
}

public String getACT_ACTN() {
    return ACT_ACTN;
}

public void setACT_ACTN(String aCT_ACTN) {
    ACT_ACTN = aCT_ACTN;
}

public String getACT_EXEC_ORDR() {
    return ACT_EXEC_ORDR;
}

public void setACT_EXEC_ORDR(String aCT_EXEC_ORDR) {
    ACT_EXEC_ORDR = aCT_EXEC_ORDR;
}

public String getRQST_STRC_ID() {
    return RQST_STRC_ID;
}

public void setRQST_STRC_ID(String rQST_STRC_ID) {
    RQST_STRC_ID = rQST_STRC_ID;
}

public Date getCRTN_DATE() {
    return CRTN_DATE;
}

public void setCRTN_DATE(Date cRTN_DATE) {
    CRTN_DATE = cRTN_DATE;
}

public Date getLAST_UPDT_DATE() {
    return LAST_UPDT_DATE;
}

public void setLAST_UPDT_DATE(Date lAST_UPDT_DATE) {
    LAST_UPDT_DATE = lAST_UPDT_DATE;
}


public ActCodeMetadataBean(String aCT_CODE, String pRDT_ID,
        String aCT_ACTN, String aCT_EXEC_ORDR, String rQST_STRC_ID,
        Date cRTN_DATE, Date lAST_UPDT_DATE) {
    super();
    ACT_CODE = aCT_CODE;
    PRDT_ID = pRDT_ID;
    ACT_ACTN = aCT_ACTN;
    ACT_EXEC_ORDR = aCT_EXEC_ORDR;
    RQST_STRC_ID = rQST_STRC_ID;
    CRTN_DATE = cRTN_DATE;
    LAST_UPDT_DATE = lAST_UPDT_DATE;
}


}
以及我的persistence.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="OMSDemo" transaction-type="RESOURCE_LOCAL" >
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

    <class>com.airtel.oms.entity.ProvisioningInterface</class>
    <class>com.airtel.oms.entity.ProvisioningTask</class>


    <!-- Cache classes -->
    <class>com.airtel.cache.ActCodeMetadataBean</class>
    <shared-cache-mode>ALL</shared-cache-mode>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:orclaq"/>
            <property name="javax.persistence.jdbc.user" value="artl"/>
            <property name="javax.persistence.jdbc.password" value="artl"/>
             <property name="javax.persistence.sharedCache.mode" value="ALL"/>
        </properties>

  </persistence-unit>


</persistence>

我能做些什么来实现它?

您从查询中得到了什么结果,并且您显示的代码应该得到一个NPE,即account=null,并且永远不要在其他任何地方设置。请注意,您的查询将填充EntityManager缓存。尝试在事务外部使用JPQL查询,而不是本机查询,因为它可以使用共享缓存来生成结果。是的,Chris you's true确实获得了NPE,但我现在将其交给了新的操作员,并且我对缓存进行了一些更改。现在包含。感谢您的建议您从查询中得到了什么结果,并且您显示的代码应该得到一个NPE作为account=null,并且永远不要在其他任何地方设置。请注意,您的查询将填充EntityManager缓存。尝试在事务外部使用JPQL查询,而不是本机查询,因为它可以使用共享缓存来生成结果。是的,Chris you's true确实获得了NPE,但我现在将其交给了新的操作员,并且我对缓存进行了一些更改。现在包含。谢谢你的建议
public static void main(String[] args) {
    EntityManagerFactory factory = Persistence
            .createEntityManagerFactory("OMSDemo");
    EntityManager manager = factory.createEntityManager();
    manager.setProperty("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE);
    Query query = (Query) manager.createNativeQuery("select * from ACT_CODE_MTDT", ActCodeMetadataBean.class);
    query.setHint("javax.persistence.cache.storeMode", 
            CacheStoreMode.USE);
    ActCodeMetadataBean account=null;
    List<Object> results = query.getResultList();
    for(Object e : results)
    {
        System.out.println(e.toString());
    }
   Cache cache = factory.getCache();

    // cache.
    System.out.println("cache.contain should return true: "+cache.contains(ActCodeMetadataBean.class, account.getACT_CODE()));
    cache.evict(ActCodeMetadataBean.class);
    System.out.println("cache.contain should return false: "+cache.contains(ActCodeMetadataBean.class, account.getACT_CODE()));
    manager.close();
    factory.close();
}
cache.contain should return true: false
cache.contain should return false: false