0

我的 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 中进行。

谢谢哈桑

4

0 回答 0