jpa 遇到问题,当被告知忽略时,看起来是从缓存中读取

Posted

技术标签:

【中文标题】jpa 遇到问题,当被告知忽略时,看起来是从缓存中读取【英文标题】:having trouble with jpa, looks to be reading from cache when told to ignore 【发布时间】:2010-05-27 18:42:43 【问题描述】:

我正在使用 jpa 和 eclipselink。它说 eclipselink 的版本为 2.0.2.v20100323-r6872。这是一个SE应用程序,很小。本地持久性单元。我正在使用 postgres 数据库。我有一些代码每秒唤醒一次并在表上执行 jpa 查询。它正在轮询以查看给定记录上的某些字段是否更改。但是当我更新 sql 中的字段时,每次查询时它都会显示相同的值。这是在等待之后,创建一个新的实体管理器,并给出一个查询提示。当我从 sql 或 python 查询表时,我可以看到更改的字段。但是在我的 jpa 查询中,一旦我读取了该值,它就不会在以后的查询执行中改变——即使实体管理器已经重新创建。我试过告诉它不要查看缓存。但它似乎忽略了这一点。很困惑,能帮忙吗?

这里是方法。我每 3 秒调用一次。 tgt.getTrlDlrs() println 显示我在每次调用该方法时都得到了相同的字段值(“值不会改变”)。即使我更改了数据库中的字段。当我从 Java 外部查询记录时,我立即看到了变化。另外,如果我停止 java 程序并重新启动它,我会立即看到新值打印出来:

public void exitChk(EntityManagerFactory emf, Main_1 mn)
    // this will be a list of the trade close targets that are active
    List<Pairs01Tradeclosetgt> mn_res = new ArrayList<Pairs01Tradeclosetgt>();

    //this is a list of the place number in the array list above
    //of positions to close
    ArrayList<Integer> idxsToCl = new ArrayList<Integer>();

    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    em.clear();
    String qryTxt =
            "SELECT p FROM Pairs01Tradeclosetgt p WHERE p.isClosed = :isClosed AND p.isFilled = :isFilled";
    Query qMn = em.createQuery(qryTxt);
    qMn.setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache);
    qMn.setParameter("isClosed", false);
    qMn.setParameter("isFilled", true);
    mn_res = (List<Pairs01Tradeclosetgt>) qMn.getResultList();

    // are there any trade close targets we need to check for closing?
    if (mn_res!=null)
        //if yes, see whether they've hit their target
        for (int i=0;i<mn_res.size();i++)
            Pairs01Tradeclosetgt tgt = new Pairs01Tradeclosetgt();
            tgt = mn_res.get(i);
            System.out.println("value won't change:" + tgt.getTrlDlrs());

这是我的实体类(部分):

@Entity
@Table(name = "pairs01_tradeclosetgt", catalog = "blah", schema = "public")
@NamedQueries(
    @NamedQuery(name = "Pairs01Tradeclosetgt.findAll", query = "SELECT p FROM Pairs01Tradeclosetgt p"),
   @NamedQuery(name = "Pairs01Tradeclosetgt.findByClseRatio", query = "SELECT p FROM Pairs01Tradeclosetgt p WHERE p.clseRatio = :clseRatio"))
public class Pairs01Tradeclosetgt implements Serializable 
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "id")
    @SequenceGenerator(name="pairs01_tradeclosetgt_id_seq", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "pairs01_tradeclosetgt_id_seq")
    private Integer id;

和我的持久性单位:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
  <persistence-unit name="testpu" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>mourv02.Pairs01Quotes</class>
    <class>mourv02.Pairs01Pair</class>
    <class>mourv02.Pairs01Trderrs</class>
    <class>mourv02.Pairs01Tradereq</class>
    <class>mourv02.Pairs01Tradeclosetgt</class>
    <class>mourv02.Pairs01Orderstatus</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://192.168.1.80:5432/blah"/>
      <property name="javax.persistence.jdbc.password" value="secret"/>
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
      <property name="javax.persistence.jdbc.user" value="noone"/>
    </properties>
  </persistence-unit>
</persistence>

【问题讨论】:

【参考方案1】:

对于那些稍后看这个的人,在表格注释下添加这个是一种解决方法: @Cache(type=CacheType.NONE)

然而,当然没有缓存。但至少我的价值刷新了。似乎 eclipse 链接不听我在上面的示例中编写的提示。

【讨论】:

以上是关于jpa 遇到问题,当被告知忽略时,看起来是从缓存中读取的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?

jpa hibernate @OneToOne @JoinColumn referencedColumnName 被忽略

iOS 6:旋转后忽略父模式的 modalPresentationStyle

试图运行for循环,被告知'float'对象不可迭代

转载阿里开源框架Egg.js文档被告知侵权,原作者:难道我才是那个恶人?

数据库知识