Hibernate:传递给持久化的分离实体

时间:2014-08-03 15:19:40

标签: java spring hibernate

在我目前的春季项目中,当我尝试在数据库中存储基于此entty的记录时:

@Entity
@Table(name="produto")
public class Produto {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Column(name="nome", nullable=false, unique=true)
    @Order(value=1)
    private String nome;

    @Column(name="preco", nullable=false)
    @Order(value=2)
    private Float preco;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="categoria")
    @Cascade(value = { org.hibernate.annotations.CascadeType.ALL })
    @Order(value=3)
    private Categoria categoria;

    @Column(name="resumo", length=140)
    @Order(value=4)
    private String resumo;

    @Column(name="descricao", length=65535)
    @Order(value=5)
    private String descricao;
}

我收到此错误:http://www.klebermota.eti.br/wp-content/erro.html

只有当我从下面的表单中选择一个项目时,才会显示错误。如果我没有选择一个选项,则记录存储没有问题。

<form id="command" class="form" action="/loja/Produto/cadastra" method="POST" enctype="multipart/form-data">
        <div class="row">
            <div class="col-md-3"></div>
            <div class="col-md-6"></div>
            <div class="col-md-3"></div>
        </div>
        <div class="row">
            <div class="col-md-3">
                <h3><label for="nome" class="label label-default">nome</label></h3>
            </div>
            <div class="col-md-6">
                <input id="nome" name="nome" class="form-control" type="text" value=""/>
            </div>
            <div class="col-md-3"></div>
        </div>
        <div class="row">
            <div class="col-md-3">
                <h3><label for="preco" class="label label-default">preco</label></h3>
            </div>
            <div class="col-md-6">
                <input id="preco" name="preco" pattern="[0-9]{3}.[0-9]{2}" class="form-control valida" type="text" value=""/>
            </div>
            <div class="col-md-3"></div>
        </div>
        <div class="row">
            <div class="col-md-3">
                <h3><label for="categoria" class="label label-default">categoria</label></h3>
            </div>
            <div class="col-md-3">

                <select id="categoria.id" name="categoria.id" class="form-control select categoria" data-nome="Categoria" data-lista="/loja/Produto/listagem3.json"></select>
            </div>
            <div class="col-md-3"></div>
        </div>
        <div class="row">
            <div class="col-md-3">
                <h3><label for="resumo" class="label label-default">resumo</label></h3>
            </div>
            <div class="col-md-6">
                <input id="resumo" name="resumo" class="form-control" type="text" value=""/>
            </div>
            <div class="col-md-3"></div>
        </div>
        <div class="row">
            <div class="col-md-3">
                <h3><label for="descricao" class="label label-default">descricao</label></h3>
            </div>
            <div class="col-md-6">
                <textarea id="descricao" name="descricao" class="form-control" rows="25" cols="50"></textarea>
            </div>
            <div class="col-md-3"></div>
        </div>
        <div class="panel panel-default">
            <div class="panel-heading">&iacute;cone do produto (jpeg, 171x180)</div>
            <div class="panel-body">
                <input type="file" name="icone" class="form-control">
            </div>
        </div>
        <div class="panel panel-default">
            <div class="panel-heading">imagem da capa (jpeg, 1280x250)</div>
            <div class="panel-body">
                <input type="file" name="file" class="form-control">
            </div>
        </div>
        <div class="panel panel-default">
            <div class="panel-heading">capturas de tela (jpeg, 960x720)</div>
            <div class="panel-body">
                <p></p>
            </div>
        </div>
        <div class="row">
            <div class="col-md-3"> <button type="submit" class="btn btn-lg btn-primary">cadastrar</button> </div>
            <div class="col-md-3"></div>
        </div>
</form>

任何人都可以告诉我这里有什么问题?我有点坚持了一段时间。

3 个答案:

答案 0 :(得分:0)

您可以尝试通过ID从数据库中选择来自客户端来设置您的Produto的Categoria。你只是插入Produto但分类。因此,你的情况分类是不可持续的,应该是。

答案 1 :(得分:0)

您可能希望使用合并而不是持久。 persist只能插入新记录,而merge将执行插入或更新。发生错误的原因是,当他们选择现有ID时,您实际上想要进行更新,而不是插入。在调用后,请务必使用merge返回的结果作为实体的新值。

答案 2 :(得分:0)

此问题的工作解决方案是该类的配置:

@Entity
@Table(name="produto")
public class Produto {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Column(name="nome", length=32, nullable=false, unique=true)
    @Order(value=1)
    private String nome;

    @Column(name="titulo", length=32, nullable=false)
    @Order(value=2)
    private String titulo;

    @Column(name="preco")
    @Order(value=3)
    private Float preco;

    @OneToOne
    @JoinColumn(name="categoria")
    @Order(value=4)
    private Categoria categoria;

    @Column(name="descricao", length=65535)
    @Order(value=5)
    private String descricao;

    @Column(name="destaque")
    @Order(value=6)
    private boolean destaque;
}

现在有了这个,我可以插入Produto个实体,其中一个被选中Categoria。我现在正在尝试解决插入问题,而无需选择Categoria