我的 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;
}
我通过以下方式将两个实体相互添加:
Customer e = em.find(Customer.class, cusID);
c.setCustomer(e);
e.getComms().add(c);
我不叫坚持或合并。由于 cascade=CascadeType.ALL ,它将新电话号码插入数据库。
我认为有两个客户类浮动的实例。如何记录客户类实例。我需要 st 来告诉我有两个不同的。St like customer.getJPAIdentificationId();
实体上的更改在包含 @PersistenceContext(unitName = "DATA") 私有 EntityManager em; 的 @Stateless Bean 中进行。
谢谢哈桑