0

PostgreSQL 9.1
Glassfish 3.1.2.2
Firefox 10.0.0.7
Linux

PostgreSQLでエンティティを永続化するためにJPAを使用しています。ただし、トリガーによって設定される1つのテーブル(Positionという名前)があり、読み取り専用として機能するそのテーブルのエンティティを使用します。エンティティは、トリガーからロードおよび操作されるため、このテーブルにデータを永続化することはありません。管理対象Beanにデータをロードして、Positionテーブルのデータを正常に表示できます。

私が抱えている問題は、データベース(Positionテーブル)がトリガーによって変更された後、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 {
    // ...

persistence.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. この回答@Accessに記載されているように、注釈をに設定してAccessType.FIELD(または、デフォルトのアクセスタイプであるため注釈を削除して)、エンティティクラスにフィールドベースの注釈を使用してください。また、この回答に記載されている方法でのみ公開ゲッターを提案してください。これにより、エンティティがアプリケーション内で変更されるのを防ぎます。
  2. この回答に記載されているように、ファイルで選択的共有キャッシュモードを有効にし、エンティティクラスpersistence.xmlに注釈を追加します。これにより、JPAは、を呼び出すときに常に永続層からエンティティをロードします。@Cacheable(false)EntityManager#find(...)
于 2019-02-02T18:12:51.823 に答える