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>