Hibernate 删除具有继承的一对多关系中的子实体引发传递给持久化的已删除实体异常

Hibernate 删除具有继承的一对多关系中的子实体引发传递给持久化的已删除实体异常,hibernate,jpa,Hibernate,Jpa,早上好 我已经为这个问题挣扎了两天了。这是我的模型: 家长: @Entity @Table(name="BANDEIRA") @SequenceGenerator(name = "SQ_BAND_SQ_BANDEIRA", sequenceName = "SQ_BAND_SQ_BANDEIRA", allocationSize = 1) public class Bandeira extends AbstractEntidade implements Serializable { ...

早上好

我已经为这个问题挣扎了两天了。这是我的模型:

家长:

@Entity
@Table(name="BANDEIRA")
@SequenceGenerator(name = "SQ_BAND_SQ_BANDEIRA", sequenceName = "SQ_BAND_SQ_BANDEIRA", allocationSize = 1)
public class Bandeira extends AbstractEntidade implements Serializable {
    ...
    private List<ObservacaoBandeira> itensObservacao = new ArrayList<ObservacaoBandeira>();
    ...

    @OneToMany(cascade = CascadeType.ALL, 
            fetch = FetchType.LAZY,
            mappedBy = "bandeira" )
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    public List<ObservacaoBandeira> getItensObservacao() {
    return itensObservacao;
    }


}
@Entity
@Table(name = "OBSERVACAO_BANDEIRA")
@SequenceGenerator(name = "SQ_OBBA_SQ_OBSERVACAO", sequenceName = "SQ_OBBA_SQ_OBSERVACAO", allocationSize = 1)
@DiscriminatorColumn(name=ObservacaoBandeira.OBSERVACAO_BANDEIRA_TIPO)
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(ObservacaoBandeira.BANDEIRA)
public class ObservacaoBandeira extends AbstractEntidade implements Serializable {

    static final String BANDEIRA = "0"; // ObservacaoBandeiraTipo.BANDEIRA;

    static final String OBSERVACAO_BANDEIRA_TIPO = "OBBA_IN_TIPO_OBSERV_BANDEIRA";

    private static final long serialVersionUID = -2835835990963971955L;

    private Long idObservacaoBandeira;
    private String observacao;
    private **Bandeira bandeira**;
    private ObservacaoBandeiraTipo observacaoBandeiraTipo;
        ....

        @ManyToOne
    @JoinColumn(name = "BAND_SQ_BANDEIRA", nullable = false)
    public Bandeira getBandeira() {
        return bandeira;
    }


@Entity
@DiscriminatorValue(ObservacaoMovimentacaoDuto.MOVIMENTACAO_MISTURA_ORGAO)
@Table(name = "OBSERVACAO_MOVIMENTACAO_DUTO")
public class ObservacaoMovimentacaoDuto extends ObservacaoBandeira implements Serializable {

    private static final long serialVersionUID = 6781122676850797573L;

    static final String MOVIMENTACAO_MISTURA_ORGAO = "2"; 

    private MovimentacaoDuto movimentacaoDuto;

    public ObservacaoMovimentacaoDuto() {
        super(ObservacaoBandeiraTipo.MOVIMENTACAO_MISTURA_ORGAO);
    }

    public ObservacaoMovimentacaoDuto(Bandeira bandeira, MovimentacaoDuto movimentacaoDuto, String observacao) {
        super(ObservacaoBandeiraTipo.MOVIMENTACAO_MISTURA_ORGAO, bandeira, observacao);
        this.movimentacaoDuto = movimentacaoDuto;
    }

    @OneToOne
    @JoinColumn(name = "MODU_SQ_MOVIMENTACAO_DUTO", nullable = false)
    public MovimentacaoDuto getMovimentacaoDuto() {
        return movimentacaoDuto;
    }

    public void setMovimentacaoDuto(MovimentacaoDuto movimentacaoDuto) {
        this.movimentacaoDuto = movimentacaoDuto;
    }
}

我只是想从Bandeira实体中删除一个“observacomovimentacaoduto”

我尝试了所有可能的已知方法(至少是我自己)。

  • 只需从集合中删除
  • 从集合中删除并调用entityManager.remove()
  • 从集合中删除,将父实体设置为null,然后调用entityManager.remove()将其删除
  • 从集合中删除,将父实体设置为null,然后持久化父实体
以下是我在控制器上的最新代码:

public void removerObsBandeira(ActionEvent event) {
        ObservacaoBandeira obs = (ObservacaoBandeira) event.getComponent().getAttributes().get("obs");

        ObservacaoBandeira obsToDelete = servico.findById(new ObservacaoBandeira() , obs.getIdObservacaoBandeira());

        Bandeira bandeira = obsToDelete.getBandeira();

        bandeira.getItensObservacao().remove(obsToDelete);

        //obsToDelete.setBandeira(null);
        servico.remover(obsToDelete);
        //servico.remover(obsToDelete);



        //obs = servico.persistir(obs);
        //servico.remover(obs);
        servico.atualizar();
        this.cenarioSelecionado.getBandeira().getItensObservacao().remove(obsToDelete);
    }
其他有关资料:

  • 弹簧2.5.x
  • JPA1.0
  • Hibernate 3.3.2.GA
  • 应用服务器Weblogic 11

提前感谢您提供的帮助。

您只需将其从集合中删除,将父实体设置为null,然后提交/关闭事务/会话。嘿。谢谢你的回复。我已经试过了。也不管用。由于完成这项任务的时间越来越短,我不得不进行一次本地查询:(。