jpa 2.01、glassfish v3 サーバーで面白いキャッシングの問題があります。
Jax-Rs POST を介して既存の顧客に電話番号を挿入します。その後、別の jax-rs GET リクエストで、その顧客からのすべての電話番号を読み取りました。GET に新しい番号がありません。5秒後にリクエストを繰り返すと、番号が含まれています。GET は、jpa キャッシュに保存されている顧客の古いインスタンスから電話番号を読み取っていると思います。新しい番号を挿入した後に顧客をキャッシュから追い出すと、問題は「解決」しました。
@Entity
@Table(schema="elm", name="CUSTOMER")
@Cache(expiry=5000)
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String no;
private String name;....
@OneToMany(
cascade=CascadeType.ALL,
mappedBy="customer",
fetch=FetchType.LAZY,
targetEntity=Comm.class
)
private List<Comm> comms = new Vector<Comm>(0);
}
@Entity
@Table(schema="elm", name="COMM")
@Cache(expiry=Constants.SHORT_CACHE_PERIODE_MS)
public class Comm implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String value;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="elmID")
private Customer customer;
}
次の方法で、2 つのエンティティを互いに追加します。
Customer e = em.find(Customer.class, cusID);
c.setCustomer(e);
e.getComms().add(c);
私は永続化またはマージを呼び出しません。cascade=CascadeType.ALL のため、新しい電話番号がデータベースに挿入されます。
Customer クラスのインスタンスが 2 つ浮かんでいると思います。Customer クラスのインスタンスをログに記録するにはどうすればよいですか。2 つの異なるものがあることを示す st が必要です。st like customer.getJPAIdentificationId();
エンティティの変更は、 @PersistenceContext(unitName = "DATA") プライベート EntityManager em; を含む @Stateless Bean で行われます。
ありがとうハサン