Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сложный биндинг в Spring -e, ну и, конечно же, c участием Hibernate 
:(
    Опции темы
fath_fast
Дата 2.7.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Итак, есть в базе две таблицы: tab1 и tab2. в tab2 есть внешний ключ на примари ки tab1... 
ТЕм самым, образуется связь "один-ко-многим"... Что касается enitity классов, то вот они:
tab1 - это  section_of_cat  - таблица всех секций
tab2 - это description_section - таблица подсекций

section_of_cat
Код

public class section_of_cat implements Serializable 
{
   @Id @GeneratedValue
   @Column(name="id_section")
   private Long id_section;
  
   @Column(name="name")
   private String name;

  ......
}



description_section
Код

public class description_section implements Serializable
{
   @Id @GeneratedValue
   @Column(name="id_descrip")
   private Long  id_descrip;
   
   @ManyToOne(cascade={CascadeType.ALL})
   @JoinColumn(name="id_section")
   private section_of_cat id_section;
   
   @Column(name="name")
  ......
}


Далее идёт веб-форма, в которой необходимо отображение одного значения секции и всех подсекций которые принадлежат этой секции... Вот. 

Один из варинтов решения, через обчные тэги: <input:  <forEach  и прочее биндить к форме и от этого плясать...
Но зачем создавать велосипед, когда можно воспользоваться неплохими спринговскими  тэгами  form, а значит, в преопределённом классе SimpleFormContoller - в конструкторе необходимо указать CommandClass, а у меня такого нет... 
Создаю и получается примерно такое чудо:

Код

public class section_of_catDAO {
   
    private section_of_cat Sect;
    private Set<description_section> Descrip;

    public Set<description_section> getDescrip() {
        return Descrip;
    }

    public void setDescrip(Set<description_section> Descrip) {
        this.Descrip = Descrip;
    }

    
    public section_of_cat getSect() {
        return Sect;
    }
   
    public void setSect(section_of_cat Sect) {
        this.Sect = Sect;
    }
}


Преопределяю  protected Object formBackingObject(HttpServletRequest request) на возврат объекта вышеуказанного класса.
А в представлении у меня появляются следующтие строки:
Код

    <form:form commandName="section_of_catDAO" method="POST" >
            <form:errors path="*"/>
            
            <table border="0" id="t2">
                <tbody>
                    
                    <tr>
                        <td valign="top">Наименование категории:</td>
                        <td valign="top">
                            <form:hidden  path="${Sect.id_section}" /> 
                            <form:input path="${Sect.name}"  /> 
                        </td>
                    </tr>
                      
                    <tr> 
                        <td colspan="2">
                            
                           <table id="f1" border="1">
                                
                                  <tr>
                                     <td>
                                        <form:input path="${Descrip.name}" />
                                     </td>
                                     <td>
                                        <input type="checkbox"   name="delete_0" value="${a1.id_descrip}"/>
                                        <form:checkbox path="${Descrip.id_descrip}" value=""/>
                                    </td>

                                </tr>
                              
                              </table>
                            
                        </td> 
                    </tr>
                   .......
                 </tbody> 
            </table>    
        </form:form>


В принципе и всё... в итоге сервер мне отвечает что не может прибиндить всё это хозяйство... 
Подскажите, где я мог ошибиться? И возможен ли вообще такой финт?
Заранее Огромное Спасибо!!!

 
PM MAIL   Вверх
v2v
Дата 2.7.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



у тебя же должны быть классы - сущности , описывающие табл. 1 и табл.2 , 
это у тебя description_section ? (должно быть 2 таких файла)
а также ты не выложил главный конфиг файл hibernate.cfg.xml (есть такой)?



--------------------
PM   Вверх
fath_fast
Дата 2.7.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



v2v, 
Цитата

у тебя же должны быть классы - сущности , описывающие табл. 1 и табл.2 , 
это у тебя description_section ? (должно быть 2 таких файла)

Эти два файла я как раз и привёл, просто не стал здесь писать геттеры и сеттеры, для компактности (но в коде они у меня есть)...
Эти классы (файлы) : section_of_cat-tab1 и description_section - tab2

Ну и конфиг гибернэйтовский (не думаю, что от него в данной ситуции что-то зависит)

Это сообщение отредактировал(а) fath_fast - 3.7.2008, 06:20
PM MAIL   Вверх
v2v
Дата 2.7.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



Цитата(fath_fast @  2.7.2008,  22:15 Найти цитируемый пост)
ти классы (файлы) : section_of_cat-tab1 и description_section - tab2

а там разве не надо использовать аннотацию @Entity перед объявлением класса-биина.
И мне не понятен класс section_of_catDAO , по моему мнению ты там должен создать / испольльзовать класс org.hibernate.SessionFactory , который загружает конфиги из hibernate.cfg.xml ... это у тебя есть?


Зы. Классный пассворд  smile 


--------------------
PM   Вверх
fath_fast
Дата 2.7.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Цитата

а там разве не надо использовать аннотацию @Entity перед объявлением класса-биина.

Везде и там (section_of_cat)  и там (description_section) стоят... дело в том,  что сущности описанные здесь рабочие (проверено smile...

Цитата

И мне не понятен класс section_of_catDAO , по моему мнению ты там должен создать / испольльзовать класс org.hibernate.SessionFactory

а вот тут ты пожалуй, прав название не очень удачное, для подобного класса...
А класс расширяющий HibernateDaoSupport тоже в наличие, и тоже работает... проблема - в этом блинском биндинге сложных типов к форме - приходится раскладывать их на стринги и лонги, чтобы всё это дело прикрепить к форме, что самом по себе очень накладно, а smile 
Сейчас шерстю маны спринговские, глядишь,  узнаю чего smile

Это сообщение отредактировал(а) fath_fast - 2.7.2008, 22:44
PM MAIL   Вверх
fath_fast
Дата 2.7.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



http://static.springframework.org/spring/d...validation.html
Ну вот к примеру по-моему нужная ссылка...
Пока возник вопрос, где этот код реализоваывать:
(пример из главы):
Код

BeanWrapper company = BeanWrapperImpl(new Company());
// setting the company name..
company.setPropertyValue("name", "Some Company Inc.");
// ... can also be done like this:
PropertyValue value = new PropertyValue("name", "Some Company Inc.");
company.setPropertyValue(value);

// ok, let's create the director and tie it to the company:
BeanWrapper jim = BeanWrapperImpl(new Employee());
jim.setPropertyValue("name", "Jim Stravinsky");
company.setPropertyValue("managingDirector", jim.getWrappedInstance());

// retrieving the salary of the managingDirector through the company
Float salary = (Float) company.getPropertyValue("managingDirector.salary");

неужто в protected Object formBackingObject(HttpServletRequest request)? 

Это сообщение отредактировал(а) fath_fast - 2.7.2008, 22:52
PM MAIL   Вверх
v2v
Дата 2.7.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



посмотри пример petclinic который входит в архив со спрингом.


--------------------
PM   Вверх
fath_fast
Дата 2.7.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



v2v, спасибо, сейчас если ещё и  здесь не осилю - загляну туда smile 
PM MAIL   Вверх
fath_fast
Дата 3.7.2008, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Вообщем, утро вечера мудренее всё-таки...
Правильный биндинг в веб-форме выглядит так:

Код

  <spring:nestedPath path="sect">
              <form action="" method="post">      
            <table border="0" id="t2">
              
                    
                    <tr>
                        <td valign="top">Наименование категории:</td>
                        <td valign="top">
                            <spring:bind path="section.name">
                                <input type="text" name="${status.expression}" value="${status.value}"/>
                            </spring:bind>  
                          <spring:bind path="section.id_section">
                                <input type="text" name="${status.expression}" value="${status.value}"/>
                            </spring:bind> 
                        </td>
                    </tr>
                      
                    <tr> 
                        <td colspan="2">
                            
                           <table  border="1">
                                
                            
                                
                                <c:forEach varStatus="a1" items="${sect.descrip}"> 
                                
                                 
                                  <tr>
                                     <td>
                                       <spring:bind path="descrip[${a1.index}].name">
                                          <input type="text" name="${status.expression}" value="${status.value}"/>
                                     </spring:bind> 
                                     </td>
                                   
                                   <td>
                                        <spring:bind path="descrip[${a1.index}].dimension">
                                          <input type="text" name="${status.expression}" value="${status.value}"/>
                                         </spring:bind> 
                                   
                                   </td>
                                   <td>
                                       
                                   
                                   </td>
                                </tr>
                            </c:forEach>
                              </table>
                            
                        </td> 
                    </tr>
                  ....
                    
            
            </table>    
       
 </form>
</spring:nestedPath>


Ну и контроллер формы (конструктор):
Код

 setCommandName("sect");
 setCommandClass(section_of_catDAO.class);


PM MAIL   Вверх
fath_fast
Дата 4.7.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Но теперь проблема в другом!
Для доавления записей в таблицу этой формц я поместил в представлении следующий код:
Код

 <input type="button" value="+" name="" onclick="Go1()"/><br>
 <input type="hidden" id="cm" name="count_mass" value="${fn:length(sect.descrip)}"/ 


А функция Go1 - есть следущее:
Код

   function Go1()
{
  
    
       var el4 = document.getElementById("cm");
       var el3 = document.getElementById("f1");
     var tr = el3.insertRow(el3.getElementsByTagName("tr").length);
     var td = tr.insertCell(0);
      td.innerHTML="<input type='text' name=descrip["+i+"].name' value=''/>";
      td= tr.insertCell(1);
      td.innerHTML="<input type='text' name='descrip["+i+"].dimension' value=''/>";
      td= tr.insertCell(2);
      td.innerHTML="<input type='checkbox' name='descrip["+i+"].id_descrip' value='OFF'/>";
      
      i++;   
           el4.value=i;
           
  
}



Вообщем,  при нажатии кнопки <input type="button" value="+" name="" onclick="Go1()"/> генерятся дополнительные поля в таблицы готовые к заполнению...
Вопрос: как это всё дело передать на сервер?


Код метода onSubmit следущий:

Код

 @Override
    protected ModelAndView onSubmit(
            HttpServletRequest request,
            HttpServletResponse response,
            Object command,
            BindException errors) throws Exception {
        ModelAndView mv = new ModelAndView();
         section_of_catDAO sect = (section_of_catDAO)command;
        catalog_entity cat = new catalog_entity();
        cat.insertSectionOfDAO(sect);

        return mv;
    }


ПРи таком раскладе, когда добавляются новые строки мне генерится исключение:

Код

java.lang.IndexOutOfBoundsException

Что делать? Кто-нибудь с подобным сталкивался?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.