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