繁体   English   中英

与JPA合并未设置FK ID

[英]Merge with JPA not setting FK id

我有两个表,它们的关系由2列组成,我的第一个实体是:

public class NfCabeca implements java.io.Serializable {

    @Id
    @SequenceGenerator(name = "nf_cabeca_sequencial_seq", sequenceName = "nf_cabeca_sequencial_seq", schema = "mobile", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "nf_cabeca_sequencial_seq")
    @Column(name = "sequencial", insertable = false, updatable = false)
    private long sequencial;

    @ManyToOne
    @NotFound(action=NotFoundAction.IGNORE)
    @MapsId("nf_cabeca_id")
    @JoinColumns({
        @JoinColumn(name = "sequencial" , referencedColumnName="nf_cabeca"), 
        @JoinColumn(name= "protocolo", referencedColumnName="protocolo")})
    private NFeProtocolo protocolo;

    @OneToMany(mappedBy = "nf_cabeca_id", cascade = CascadeType.ALL)
    private List<NFeProtocolo> protocolos = new ArrayList<NFeProtocolo>();

 public void setProtocolo(NFeProtocolo protocolo) {
    this.protocolo = protocolo;
    protocolos.remove(protocolo);
    protocolo.setNf_cabeca_id(this);
    protocolos.add(protocolo);
  }
}

我的第二个实体是:

public class NFeProtocolo implements Serializable {



/**
     * 
     */
    private static final long serialVersionUID = 2092981840170296102L;

    @Id
    @ManyToOne
    @JoinColumn(name = "nf_cabeca" , referencedColumnName="sequencial", updatable = false)
    private NfCabeca nf_cabeca_id;

    @Id
    @Column(name = "protocolo", length = 100)
    private String protocolo;

    @Column(name = "operacao", length = 15, nullable = false)
    @Enumerated(EnumType.STRING)
    private NFeProtocoloOperacao operacao;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "data_hora", length = 29, nullable = false)
    private Date dataHora;

    @Column(name = "status", length = 10)
    private String status;
}

问题是当我在NFeProtocolo设置NFCabeca

NFeProtocolo nFeProtocolo = new NFeProtocolo(protocolo, operacao, dataProtocolo, status);
nFeProtocolo.setNf_cabeca_id(nf);

nf.setProtocolo(nFeProtocolo);
merge(nf);

我得到一个错误:

错误消息,提示列nf_cabeca不能设置为null

确实不能,但是在设置nf_cabeca值时我做错了什么? 监视对象nFeProtocolo时,它没有暴露nf_cabeca_id。

协议内容:

[NFeProtocolo [protocolo = 333170000339533,Operacao = CRIACAO,dataHora = BRT Aug 3 09:19:11 BRT 2017,status = 100]]

为什么不将nf_nf_cabeca_id设置在外面?

解决方案是创建一个

public void setProtocolos(List<NFeProtocolo> protocolos) {
    this.protocolos = protocolos;
}

在NfCabeca上,将NfeProtocolo上的nf_cabeca_id更改为

@ManyToOne
@JoinColumn(name = "nf_cabeca")
private NfCabeca nf_cabeca_id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM