Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Problemas ao mapear uma entidade com @ID

Entidade

@Entity
public class Estoque implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @OneToOne
    private Produto produto;
    private double total;

    public Estoque(Produto produto) {
        this.produto = produto;
    }
}

DAO

@Repository
@Transactional
public class EstoqueDAO {

    @PersistenceContext
    private EntityManager manager;
    public void criaEstoquePara(Produto produto) {
        Estoque estoque = new Estoque(produto);
        manager.merge(estoque);
    }
}

Ao salvar a entidade acontece o seguinte erro:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/sistema] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'produto_id' cannot be null

Já verifiquei se o estoque.produto contém de fato o produto, gostaria de saber se estou mapeando corretamente.

5 respostas

Essa annotation @Id deverá ser colocada para um atributo id dentro de seu objeto Produto. Pois não tem como um objeto complexo, no caso o Produto ser uma chave primária para o objeto Estoque.

Abraços!

você não está criando uma PK..

@Entity
public class Estoque implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id @GeneretedValue
    private Integer id;
    @OneToOne
    private Produto produto;
    private double total;

    public Estoque(Produto produto) {
        this.produto = produto;
    }

Desculpe, mas n expliquei direito. Gostaria que o ID do Estoque fosse o mesmo do Produto, por isso anotei o o Produto com @Id. É possível fazer isso dessa forma? Existe outra forma de fazer isso?

Posso estar viajando muito, mas o @id seu no caso é Auto Incrementado, certo? Então cada objeto tem um id. Enfim, não seria mais simples criar um código do produto? Dessa forma poderia usar nos dois.

solução!

Você tem que gerar duas chaves PKs pras classes.. assim que vai fazer o relacionamento voce anotou com @onetoone ali encima e pra formar a terceira tabela a de relacionamento, será necessarios ter criado as pks.. espero ter ajudado