首页 > 解决方案 > @OneToMany 插入后返回 null

问题描述

我有个问题

在使用 Hibernate 的 Java Web 项目中,我有一个具有 @OneToMany 关系的实体

当我部署站点时,@OneToMany 关系正常工作

保存后,所有内容都正确保存在数据库中,但此新记录的 @OneToMany 返回 null

如果我再次进行部署,那么 @OneToMany 工作

我的小儿科

@Entity
@Table(name = "pedido")
@NamedQueries({
    @NamedQuery(name = "pedido.findAll", query = "SELECT p FROM Pedido p")
})
public class Pedido implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    @Column(name = "valor_total")
    private Double valorTotal;
    
    @ManyToOne
    @JoinColumn(name = "usuario_id")
    private Usuario usuario;
    
    @OneToMany(mappedBy = "pedido")
    private List<ProdutoPedido> produtoPedidos;
    
    public Integer getId()
    {
        return id;
    }

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

    public Double getValorTotal()
    {
        return valorTotal;
    }

    public void setValorTotal(Double valorTotal)
    {
        this.valorTotal = valorTotal;
    }

    public Usuario getUsuario()
    {
        return usuario;
    }

    public void setUsuario(Usuario usuario)
    {
        this.usuario = usuario;
    }

    public List<ProdutoPedido> getProdutoPedidos()
    {
        return produtoPedidos;
    }

    public void setProdutoPedidos(List<ProdutoPedido> produtoPedidos)
    {
        this.produtoPedidos = produtoPedidos;
    }
    
}

我的 ProdutoPedido 课程

@Entity
@Table(name = "produto_pedido")
@NamedQueries({
    @NamedQuery(name = "produto_pedido.findAll", query = "SELECT pp FROM ProdutoPedido pp")
})
public class ProdutoPedido implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    @ManyToOne
    @JoinColumn(name = "produto_id")
    private Produto produto;
    
    @ManyToOne
    @JoinColumn(name = "pedido_id")
    private Pedido pedido;
    
    public Integer getId()
    {
        return id;
    }

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

    public Produto getProduto()
    {
        return produto;
    }

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

    public Pedido getPedido()
    {
        return pedido;
    }

    public void setPedido(Pedido pedido)
    {
        this.pedido = pedido;
    }
}

我的 PedidoB 课

@Named(value = "pedidoB")
@RequestScoped
public class PedidoB
{

    @Inject
    private PedidoDAO pedidoDAO;

    public PedidoB()
    {
    }
    
    public List<Pedido> getTodosPedidos()
    {
        return pedidoDAO.getAllResults("pedido.findAll");
    }
}

标签: javahibernatejpajava-ee-8

解决方案


我不确定您如何保存实体,但我的猜测是您需要告诉 hibernate 在保存 pedido 时应该将哪些操作级联到子实体。

您所描述的可以通过指定这些来修复

@OneToMany(mappedBy = "pedido", cascade = { PERSIST, MERGE })

关于该主题的简短教程


推荐阅读