Hibernate: отдельная сущность передана для сохранения

1

В моем текущем весеннем проекте, когда я пытаюсь сохранить в базе данных запись, основанную на этой теме:

@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>

Кто-нибудь может сказать мне, что здесь не так? Я немного застрял в этом какое-то время.

Теги:
spring
hibernate

3 ответа

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.

0

Можете ли вы попытаться установить Категорию вашего Produto, выбрав из базы данных по идентификатору, поступает от клиента. Вы просто вставляете Produto, но Categoria. Так что в вашей ситуации категоричность не стойка и должна быть.

  • 0
    Но я думаю, что я делаю это (параметры из select добавляются с помощью jquery / json, а значение - это идентификатор категории, например, этот target.append('<option class="form-control" value="'+item.id+'">'+item.nome+'</option>') ). Есть ли другой способ сделать это?
0

Возможно, вы захотите использовать слияние вместо сохранения. persist может только вставить новую запись, тогда как merge будет выполнять вставку или обновление. Ваша ошибка возникает, потому что, когда они выбирают существующий идентификатор, вы действительно хотите сделать обновление, а не вставку. Обязательно используйте результат, полученный от объединения, как новое значение вашего объекта после его вызова.

  • 0
    Хорошо, когда я использую слияние вместо сохранения, я не получаю ошибку, выбирая или нет вариант; но когда я выбираю опцию, она не сохраняется в базе данных.
  • 0
    @KleberMota. Попытайтесь использовать licManager.flush () после вашего entityManager.merge () и убедитесь, что вы закрываете транзакцию впоследствии. Также убедитесь, что вы делаете что-то вроде myEntity = entityManager.merge (myEntity)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню