0

PostgreSQL 9.1
Glassfish 3.1.2.2
火狐 10.0.0.7
Linux

我正在使用 JPA 在 PostgreSQL 中持久化实体。但是,有一个由触发器填充的表(名为 Position),我使用该表的一个实体作为只读的。实体从不将数据持久保存到此表中,因为它是从触发器加载和操作的。我可以将数据加载到我的托管 bean 并查看 Position 表数据。

我遇到的问题是,一旦触发器修改了数据库(位置表),当再次查询位置表时,值仍然相同。Position 实体仍然包含旧值并且没有重新加载。

这是处理 Position 实体的 bean。我添加了 em.flush() 没有帮助,并且不确定如何以这种方式使用 em.refresh() 。实际上,无论如何,同步将如何提供帮助,因为它不知道我想在没有查询的情况下同步到什么。

非常感谢任何帮助。

EJB...

@Stateless
public class PositionBean implements IPosition {
    @PersistenceContext(unitName="positionbean-pu")
    private EntityManager em;

    public Position getPositionById(Integer posId) {
        Position pos = null;

        try {
            pos = (Position) em.createNamedQuery("findPosition")
                .setParameter("posId", posId).getSingleResult();
        }
        catch (Exception e) {
            throw new EJBException(e.getMessage());
        }

        return pos;
   }

实体 bean ...

@Entity
@SequenceGenerator(name="posIdGen", initialValue=10000,
    sequenceName="pos_seq", allocationSize=1)
@NamedQuery(name="findPosition",
    query="SELECT p FROM Position p WHERE p.posId = :posId")
@Table(name="Position")
public class Position implements Serializable {
    // ...

持久性.xml

<persistence-unit name="positionbean-pu" transaction-type="JTA">
    <jta-data-source>jdbc/postgreSQLPool</jta-data-source>
</persistence-unit>
4

2 回答 2

1

万一有人遇到这种情况,我学会了如何使用 refresh() 并解决了我的问题。

        pos = (Position) em.createNamedQuery("findPosition")
            .setParameter("posId", posId).getSingleResult();

        em.refresh(pos);
于 2012-11-15T21:17:10.603 回答
0

在我看来,创建“外部”更新的只读实体的正确方法如下:

  1. 如this answer@Access中所述,通过将注释设置为AccessType.FIELD(或删除注释,因为它是默认访问类型),对实体类使用基于字段的注释。还建议仅按照此答案中的说明提出公共吸气剂。这可以防止实体在应用程序中被修改。
  2. 在文件中启用选择性共享缓存模式persistence.xml并将注释添加@Cacheable(false)到实体类中,如本答案中所述。这会强制 JPA 在您调用时始终从持久层加载实体EntityManager#find(...)
于 2019-02-02T18:12:51.823 回答