Remoção de item em Lista

Boa tarde galera…
Estou com o seguinte problema, talvez seja até simples, mas estou desde ontem tentando arrumar e ainda não consegui, então toda ajuda é bem vinda…

Seguinte: Eu tenho duas listas na página da venda, uma com itensVenda, e outra com maoDeObra…
A lista itensVenda, remove normalmente e funciona de acordo como eu preciso, porém a lista maoDeObra, após adicionar várias Mão de Obra, quanto tento remover alguma, ela sempre remove o primeiro item da lista…
Gostaria de alguma ajuda pra isso…

maodeobra.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">

    <p:panelGrid columns="2" layout="grid" columnClasses="coluna10, coluna90">

        <p:outputLabel value="Mão de Obra:" for="maodeobra"/>
        <h:panelGroup>
            <p:inputText id="maodeobra" value="#{vendaControle.maoDeObra.descricao}"/>
        </h:panelGroup>

        <p:outputLabel value="Valor:" for="valor"/>
        <p:inputText id="valor" 
                     value="#{vendaControle.maoDeObra.valor}">
            <f:convertNumber minFractionDigits="2"
                             maxFractionDigits="2"/>
        </p:inputText>

        <p:commandButton value="Adicionar"
                         icon=" ui-icon-circle-triangle-s"
                         action="#{vendaControle.addItem2()}"
                         ajax="false"/>

    </p:panelGrid>

    <p:dataTable value="#{vendaControle.venda.maoDeObra}"
                 var="obra"
                 paginator="true" rows="5"
                 rowIndexVar="rowIndex"
                 emptyMessage="Nenhum registro encontrado">

        <p:column headerText="Descrição" width="10%" style="text-align:center">
            <h:outputText value="#{obra.descricao}"/>
        </p:column>

        <p:column headerText="Valor" width="10%" style="text-align:center">
            <h:outputText value="#{obra.valor}">
                <f:convertNumber minFractionDigits="2"
                                 maxFractionDigits="2"
                                 type="currency"
                                 currencySymbol="R$"/>
            </h:outputText>

        </p:column>

        <p:column headerText="Remover" width="20%" style="text-align:center">
            <p:commandButton value="Remover"
                             icon="ui-icon-circle-triangle-n"
                             action="#{vendaControle.removeItem2(obra)}"
                             ajax="false"/>
        </p:column>

    </p:dataTable>

</html>

>> VendaControle.java

package controle;

import converter.ConverterGenerico;
import entidades.ItemVenda;
import entidades.MaoDeObra;
import entidades.Venda;
import facade.VendaFacade;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@ViewScoped
public class VendaControle implements Serializable {

    private Venda venda;
    @Inject
    private VendaFacade vendaFacade;
    private ConverterGenerico converterGenerico;
    private ItemVenda itemVenda = new ItemVenda();
    private MaoDeObra maoDeObra = new MaoDeObra();

    public void addItem() {
        try {
            venda.addItem(itemVenda);
            itemVenda = new ItemVenda();
        } catch (Exception ex) {
            ex.printStackTrace();
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, ex.getMessage(), "");
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }
    
    public void addItem2() {
        try {
            venda.addItem2(maoDeObra);
            maoDeObra = new MaoDeObra();
        } catch (Exception ex) {
            ex.printStackTrace();
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, ex.getMessage(), "");
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }

    public void removeItem(ItemVenda i) {
        venda.removeItem(i);
    }
    
    public void removeItem2(MaoDeObra m) {
        venda.removeItem2(m);
    }

    public ConverterGenerico converter() {
        if (converterGenerico == null) {
            converterGenerico = new ConverterGenerico(vendaFacade);
        }
        return converterGenerico;
    }

    public void novo() {
        venda = new Venda();
        itemVenda = new ItemVenda();
        maoDeObra = new MaoDeObra();
    }

    public String salvar() {
        try {
            venda.validar();
            venda.movimenta();
            vendaFacade.salvar(venda);
            return "list?faces-redirect=true";
        } catch (Exception ex) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), "");
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
        return null;
    }

    public String excluir(Venda v) {
        vendaFacade.excluir(v);
        return "list?faces-redirect=true";
    }

    public List<Venda> getListagem() {
        return vendaFacade.listar();
    }

    public Venda getVenda() {
        return venda;
    }

    public void setVenda(Venda venda) {
        this.venda = venda;
    }

    public ItemVenda getItemVenda() {
        return itemVenda;
    }

    public void setItemVenda(ItemVenda itemVenda) {
        this.itemVenda = itemVenda;
    }

    public MaoDeObra getMaoDeObra() {
        return maoDeObra;
    }

    public void setMaoDeObra(MaoDeObra maoDeObra) {
        this.maoDeObra = maoDeObra;
    }

}

Venda.java (entidade)

package entidades;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.swing.JOptionPane;

@Entity
@Table(name = "venda")
public class Venda implements Serializable, MovimentaEstoque, Validador {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ven_id")
    private Long id;

    @Column(name = "ven_data", nullable = false)
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date data = new Date();

    @Column(name = "ven_totalfinal", nullable = false)
    private BigDecimal totalfinal = BigDecimal.ZERO;

    @Column(name = "ven_desconto", nullable = true)
    private BigDecimal desconto = BigDecimal.ZERO;

    @Column(name = "ven_tipo", nullable = false)
    @Enumerated(EnumType.STRING)
    private VendaTipo vendaTipo = VendaTipo.VENDA;

    @OneToMany(cascade = CascadeType.ALL,
            fetch = FetchType.LAZY,
            mappedBy = "venda",
            orphanRemoval = true)
    private List<ItemVenda> itensVenda = new ArrayList<>();

    @OneToMany(cascade = CascadeType.ALL,
            fetch = FetchType.LAZY,
            mappedBy = "venda",
            orphanRemoval = true)
    private List<MaoDeObra> maoDeObra = new ArrayList<>();

    @ManyToOne
    @JoinColumn(name = "ven_cliente", nullable = false)
    private Cliente cliente;
    @ManyToOne
    @JoinColumn(name = "ven_funcionario")
    private Funcionario funcionario;

    public void addItem(ItemVenda item) throws Exception {
        item.setVenda(this);
        if (!itensVenda.contains(item)) {
            item.setPreco(item.getProduto().getPreco());
            itensVenda.add(item);
            calculaTotal();
        } else {
            JOptionPane.showMessageDialog(null, "O produto '" + item.getProduto().getNome() + "' já está adicionado na venda");
            throw new Exception("");
        }
    }

    public void addItem2(MaoDeObra obra) throws Exception {
        obra.setVenda(this);
        maoDeObra.add(obra);
        calculaTotal();
    }

    @Override
    public void movimenta() throws Exception {
        if (vendaTipo.equals(VendaTipo.VENDA)) {
            for (ItemVenda item : itensVenda) {
                item.getProduto().baixarEstoque(item.getQuantidade());
            }
        }
    }

    @Override
    public void validar() throws Exception {
        if (itensVenda.isEmpty() && maoDeObra.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Não é possivel salvar uma venda em branco");
            throw new Exception("");
        }
    }

    public void removeItem(ItemVenda item) {
        itensVenda.remove(item);
        calculaTotal();
    }

    public void removeItem2(MaoDeObra obra) {
        maoDeObra.remove(obra);
        calculaTotal();
    }

    public void calculaTotal() {
        if (desconto == null || desconto.compareTo(totalfinal) >= 0) {
            desconto = BigDecimal.ZERO;
        }
        totalfinal = BigDecimal.ZERO;
        for (ItemVenda iv : itensVenda) {
            totalfinal = totalfinal.add(iv.getPreco().multiply(iv.getQuantidade()));
        }
        for (MaoDeObra mo : maoDeObra) {
            totalfinal = totalfinal.add(mo.getValor());
        }
        totalfinal = totalfinal.subtract(desconto);
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public BigDecimal getTotalfinal() {
        return totalfinal;
    }

    public void setTotalfinal(BigDecimal totalfinal) {
        this.totalfinal = totalfinal;
    }

    public BigDecimal getDesconto() {
        return desconto;
    }

    public void setDesconto(BigDecimal desconto) {
        this.desconto = desconto;
    }

    public List<ItemVenda> getItensVenda() {
        return itensVenda;
    }

    public void setItensVenda(List<ItemVenda> itensVenda) {
        this.itensVenda = itensVenda;
    }

    public List<MaoDeObra> getMaoDeObra() {
        return maoDeObra;
    }

    public void setMaoDeObra(List<MaoDeObra> maoDeObra) {
        this.maoDeObra = maoDeObra;
    }

    public VendaTipo getVendaTipo() {
        return vendaTipo;
    }

    public void setVendaTipo(VendaTipo vendaTipo) {
        this.vendaTipo = vendaTipo;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 97 * hash + Objects.hashCode(this.id);
        hash = 97 * hash + Objects.hashCode(this.itensVenda);
        hash = 97 * hash + Objects.hashCode(this.maoDeObra);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Venda other = (Venda) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        if (!Objects.equals(this.itensVenda, other.itensVenda)) {
            return false;
        }
        if (!Objects.equals(this.maoDeObra, other.maoDeObra)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return id.toString();
    }

}