2017-02-23 112 views
0

В моем нынешнем весеннем, у меня есть форма, как что:Spring/Hibernate не сохраняющийся все данные занесена из формы HTML

<form role="form" class="form" id="form" method="post" action="/loja/pagina/insert" enctype="multipart/form-data"> 
     <input class="form-control" type="hidden" name="id" /> 

     <label>Title</label> 
     <input class="form-control" type="text" name="titulo" /> 

     <ul class="nav nav-tabs" role="tablist"> 
      <li role="presentation" class="active"> 
      <a href="#pt-BR" aria-controls="pt-BR" role="tab" data-toggle="tab">pt-BR</a> 
      </li> 
      <li role="presentation"> 
      <a href="#es-ES" aria-controls="es-ES" role="tab" data-toggle="tab">es-ES</a></li> 
      <li role="presentation"><a href="#en-US" aria-controls="en-US" role="tab" data-toggle="tab">en-US</a></li> 
     </ul> 

     <div class="tab-content"> 
      <div role="tabpane1" class="tab-pane active" id="pt-BR"> 
      <input type="hidden" name="textos.idioma" value="pt-BR" /> 
      <textarea class="summernote" name="textos.conteudo"></textarea> 
      </div> 

      <div role="tabpane1" class="tab-pane" id="es-ES"> 
      <input type="hidden" name="textos.idioma" value="es-ES" /> 
      <textarea class="summernote" name="textos.conteudo"></textarea> 
      </div> 

      <div role="tabpane1" class="tab-pane" id="en-US"> 
      <input type="hidden" name="textos.idioma" value="en-US" /> 
      <textarea class="summernote" name="textos.conteudo"></textarea> 
      </div> 
     </div> 
</form> 

Когда я отправить форму к этому методе:

контроллеру

@RequestMapping(value = "/insert", method=RequestMethod.POST) 
@ResponseBody 
@PreAuthorize("hasPermission(#user, 'insert_'+#this.this.name)") 
public void insert(@Valid E object, BindingResult result) { 
    serv.insert(object); 
} 

служба

@Transactional 
public void insert(E object) { 
    dao.insert(object); 
} 

дао

@Transactional 
public void insert(E object) { 
    Session session = sessionFactory.openSession(); 
    Transaction tx = null; 
    try { 
     tx = session.beginTransaction(); 
     session.persist(object); 
     tx.commit(); 
    } catch (Exception e) { 
     if(tx != null) 
      tx.rollback(); 
    } finally { 
     session.close(); 
    } 
} 

только поле titulo это сохраняется. поле textos, которое представлено этот класс сущностей (добытчики и сеттер опущена):

@Entity 
public class Texto extends Model { 

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

    @Column 
    private String idioma; 

    @Column 
    private String conteudo; 
} 

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

ответ

0

С намеком вверенного мне абонентский @AnsgarSchulte в этом вопросе, я изменить HTML-код в виде для name="textos[0] и изменить свой класс PropertyEditorSupport обрабатывать этот массив и возвращает Texto объекта со свойством idioma, являющегося первым элемент вектора, а свойство conteudo - это все элементы слева (объединение всех из них в одну строку).

0

Я предполагаю, что ваш класс модели Texto имеет отношение @OneToMany к классу E, так что один E ссылается на несколько экземпляров Texto. Если это то, что выражает ваша модель, вам придется использовать другой синтаксис для имен вашей текстовой области, чтобы Spring могла анализировать вашу полезную нагрузку.

В вашем случае Spring будет искать свойство textos.conteudo для вашего класса E. Как я полагаю, это textos будет сборником, Spring проигнорирует это.

Предполагая, что textos будет смоделирован как коллекция с индексированным основанием, например List, попробуйте переименовать ваши имена текстовых полей в name="textos[0].conteudo" и так далее, чтобы сообщить Spring, что textos - это List и Spring, которые смогут анализировать полезную нагрузку POST.