删除一对多关系中的子实体,并将继承抛出已删除的实体传递给持久异常

时间:2013-05-03 16:02:32

标签: hibernate jpa

早上好。

我一直在努力解决这个问题2天了。这是我的模特:

家长:

@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实体中删除“ObservacaoMovimentacaoDuto”。

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

  • 只需从集合中删除
  • 从集合中删除并调用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);
    }

其他相关信息:

  • Spring 2.5.x
  • JPA 1.0
  • Hibernate 3.3.2.GA
  • Application Server Weblogic 11

提前感谢您的帮助。

0 个答案:

没有答案