我正在做的只是创建一个对象,然后尝试将其保存到数据库中。
public O create(O o) {
em.getTransaction().begin();
em.persist(o);
em.getTransaction().commit();
em.refresh(o);
return o;
}
这是实体类:
@Entity
@Table(name = "o")
public class O implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
@ManyToOne(cascade=CascadeType.REFRESH, fetch = FetchType.LAZY)
@JoinColumn(name = "b_id")
private B b;
@OneToMany(fetch = FetchType.EAGER , cascade = CascadeType.ALL)
@JoinTable(name="o_p",
joinColumns=@JoinColumn(name="o_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="p_id", referencedColumnName="id"))
private List<P> p;
怎么了... :
DataService<O> das = new ODataService();
O o = new O();
das.create(O);
对象是在数据库中创建的,并且事务结束,但是在刷新(o)时,实体管理器正在查询id为0的O,但O id会自动递增为某个不为0的值。因此,按0进行查询将不返回任何内容,抛出EntityNotFoundException。为什么刷新正在搜索ID为0的对象?可能是对象o在缓存中未更新,而EntityManager仍然认为该对象的ID为0;
该ID由数据库自动生成。但是JPA对此一无所知,因为您还没有告诉过它。因此,它假设实体的ID是调用时的实体ID persist()
:0。
您必须告诉JPA,数据库会生成ID:
@GeneratedValue(strategy = IDENTITY)
private int id;
这样,在JPA将行插入数据库后,它将向数据库询问生成的密钥,并将其分配给ID。因此,您的刷新将无用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句