实体在jpa缓存中存在多次

时间:2013-04-19 13:59:20

标签: jpa eclipselink glassfish-3

我的jpa 2.01,glassfish v3服务器有一个有趣的缓存问题。

我通过Jax-Rs POST向现有客户插入电话号码。 然后我在一个单独的jax-rs GET请求中读取该客户的所有telefonnumbers。 在GET中缺少新号码。当我在5秒后重复请求时,它包含该号码。我假设GET正在从存储在jpa缓存中的旧客户实例中读取telefonnumbers。当我在插入新号码后从缓存中逐出客户时,我的问题就“解决了”。

@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);

我不会调用persist或merge。由于cascade = CascadeType.ALL,它会将新电话号码插入数据库。

我认为Customer类浮动arround有两个实例。如何记录Customer类实例。我需要s.t.这告诉我有两个不同的。 S.T.像customer.getJPAIdentificationId();

实体上的更改在包含a的@Stateless Bean中是dann     @PersistenceContext(unitName =“DATA”)     私有EntityManager em;

谢谢哈桑

0 个答案:

没有答案