Hibernate - @IdClass @ManyToOne - 主键也是外键

时间:2015-01-09 22:03:35

标签: spring hibernate jpa

我在保存实体时遇到一点问题(这个问题只在保存时发生,我说这是因为我可以在findAll时执行正常操作)

正如我所说,在保存实体(repository.save(entity))时,我得到了跟随异常

//org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.Integer' to required type 'net.lapasta.model.entity.Produto' for property 'produto'; 
//nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.Integer] to required type [net.lapasta.model.entity.Produto] for property 'produto': no matching editors or conversion strategy found

我的实体是:

@Entity
@IdClass(ProdutoEstoqueRegra.PrimaryKey.class)
@Table(name = "PRODUTO_ESTOQUE_REGRA")
public class ProdutoEstoqueRegra extends BaseEntity
{
    private static final long serialVersionUID = 2977957269715314234L;

    public static class PrimaryKey extends BaseEntity
    {
        private static final long serialVersionUID = 5136771432344094321L;

        private Produto produto;
        private Produto produtoEstoque;

        public PrimaryKey()
        {

        }

        public PrimaryKey(Produto produto, Produto produtoEstoque)
        {
            this.produto = produto;
            this.produtoEstoque = produtoEstoque;
        }

        public Produto getProduto()
        {
            return produto;
        }

        public void setProduto(Produto produto)
        {
            this.produto = produto;
        }

        public Produto getProdutoEstoque()
        {
            return produtoEstoque;
        }

        public void setProdutoEstoque(Produto produtoEstoque)
        {
            this.produtoEstoque = produtoEstoque;
        }

        @Override
        public int hashCode()
        {
            final int prime = 31;
            int result = 1;

            result += prime * result + (produto == null ? 0 : produto.getProdutoId() == null ? 0 : produto.getProdutoId().hashCode());
            result += prime * result + (produtoEstoque == null ? 0 : produtoEstoque.getProdutoId() == null ? 0 : produtoEstoque.getProdutoId().hashCode());

            return result;
        }

        @Override
        public boolean equals(Object object)
        {
            if(this == object)
            {
                return true;
            }

            if(!(object instanceof ProdutoEstoqueRegra))
            {
                return false;
            }

            ProdutoEstoqueRegra produtoEstoqueRegra = (ProdutoEstoqueRegra) object;

            if(produto == null)
            {
                if(produtoEstoqueRegra.getProduto() != null)
                {
                    return false;
                }
            }
            else if(produto.getProdutoId() == null)
            {
                if(produtoEstoqueRegra.getProduto().getProdutoId() != null)
                {
                    return false;
                }
            }
            else if(!produto.equals(produtoEstoqueRegra.getProduto()))
            {
                return false;
            }

            if(produtoEstoque == null)
            {
                if(produtoEstoqueRegra.getProdutoEstoque() != null)
                {
                    return false;
                }
            }
            else if(produtoEstoque.getProdutoId() == null)
            {
                if(produtoEstoqueRegra.getProdutoEstoque().getProdutoId() != null)
                {
                    return false;
                }
            }
            else if(!produtoEstoque.getProdutoId().equals(produtoEstoqueRegra.getProdutoEstoque().getProdutoId()))
            {
                return false;
            }

            return true;
        }
    }

    @Id
    @ManyToOne
    @JoinColumn(name = "ID_PRODUTO")
    private Produto produto;

    @Id
    @ManyToOne
    @JoinColumn(name = "ID_PRODUTO_ESTOQUE")
    private Produto produtoEstoque;

    @Column(name = "QUANTIDADE")
    private BigDecimal quantidade;
}

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题...我自己最后解决了:) 在您的情况下,我假设Produto的id类型为Long,您需要更改您的PrimaryKey类,如下所示:

public static class PrimaryKey extends BaseEntity
{
    private static final long serialVersionUID = 5136771432344094321L;

    private Long produto;
    private Long produtoEstoque;

    public PrimaryKey()
    {

    }

    public PrimaryKey(Long produto, Long produtoEstoque)
    {
        this.produto = produto;
        this.produtoEstoque = produtoEstoque;
    }

    public Long getProduto()
    {
        return produto;
    }

    public void setProduto(Long produto)
    {
        this.produto = produto;
    }

    public Long getProdutoEstoque()
    {
        return produtoEstoque;
    }

    public void setProdutoEstoque(Long produtoEstoque)
    {
        this.produtoEstoque = produtoEstoque;
    }

    //...
}