我的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;
谢谢哈桑