Java JPA onetoone关系目标获取插入而不是更新
我已经看到了类似的问题,但还没有从中找出答案 我有两个豆子,它们是单向的一对一关系 下表包含请求附件的forigen键Java JPA onetoone关系目标获取插入而不是更新,java,mysql,jpa,Java,Mysql,Jpa,我已经看到了类似的问题,但还没有从中找出答案 我有两个豆子,它们是单向的一对一关系 下表包含请求附件的forigen键 public class Requesttracking implements Serializable { @OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST) @JoinColumn(name="raid") private Requestattachment requestattachment; 这是我
public class Requesttracking implements Serializable {
@OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)
@JoinColumn(name="raid")
private Requestattachment requestattachment;
这是我用来存储附件的表
public class Requestattachment implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int raid;
@Lob
private byte[] attachment;
现在要添加一个新实体,我只需添加Requesttracking.set(requestattachment)并将其持久化,它就能完美地工作
我的问题是当我尝试更新requestracking时
Requesttracking r=em.find(Requesttracking.class, rt.getRqid());
r.setRequestattachment(rt.getRequestattachment());
em.flush();
它不是更新requestattachment,而是创建一个新的requestattachement,将其添加到requestattachment表中,并将新的forigen键添加到requesttracking表中
我的问题是,现在requestattachment中只有一个条目没有意义
我希望发生的是requestattachment保留相同的主键,只是更新附件,因此requesttracking中的外键保持不变
我已经想到了几种解决方法,只要在更新时删除旧的requestattachment即可。或者手动更新requestattachment,并将其保留在请求跟踪中。但我觉得真的应该有更好的方法,我遗漏了一些东西,“rt.getRequestAttachment”处于什么状态?转瞬即逝的独立的托管?您确定rt.getRequestattachment()返回托管实例吗?@NeilStockton它处于分离状态,然后可能查看您使用的JPA实现的日志,看看它对该操作的说明。我知道我使用的impl会说什么是happening@NeilStockton明白了谢谢