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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент-сервер, работа с БД 
:(
    Опции темы
CrasyMen
Дата 25.4.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня есть клиент и сервер. Сервер берет данные из БД с помощью Hibernate и отдает их клиенту. Клиент выводит все это в таблицы (JTable). Пользователь может править таблицы и после окончания работы все данные пересылаются на сервер и сервер обновляет БД. 

Данные я передаю в виде строк, которые сгруппированы в ArrayList'ы, тоесть передается 5 штук объектов типа ArrayList<String>.

Такой подход меня не устраивает. Нужно сделать что то типа: Клиент посылает запрос на сервер, тот в сою очередь берет данные из БД и отсылает назад. Или, раз уж у меня хибернейт, передавать объекты. Как это сделать? 

Пригодятся примеры небольших клиент-серверных программ, которые работают с БД. Будет идеально если там еще хибернейт прикручен. Хотелось бы посмотреть как там организована передача запросов по сети. Я

Добавлено через 3 минуты и 26 секунд
Вот минимальный пример от Антона Сабурова http://antonsaburov.narod.ru/students/part18.html. Как переделать его чтобы работало по сети?


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
CrasyMen
Дата 26.4.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я хочу передавать сериализированные объекты по сети. Но объекты эти - это объекты классов сущностей (entity), которые хибернейт проецирует на таблицы в БД.
Вот примеры таких классов:
Member:
Код

package library.entity;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name="members")
public class Member implements Serializable {

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

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;

    @Column(name="middle_name")
    private String middleName;

    @Column(name="notes")
    private String notes;

    @ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
    @JoinColumn(name = "group_id")
    private Group group;

    //@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="member")
    //private List<Card> CardList;

    public Long getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getMiddleName() {
        return middleName;
    }

    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }

    public Group getGroup() {
        return group;
    }

    public void setGroup(Group group) {
        this.group = group;
    }
}

Group:
Код

package library.entity;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name="groups")
public class Group implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="group_id")
    private Long id;

    @Column(name="name")
    private String name;

    @ManyToOne(cascade= {CascadeType.REFRESH}, fetch=FetchType.LAZY)
    @JoinColumn(name="parent")
    private Group parent;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Group getParent() {
        return parent;
    }

    public void setParent(Group parent) {
        this.parent = parent;
    }
}

Таких классов у меня всего 5 штук. Я просто скопировал эти классы (объекты которых которых я буду передавать по сети) в проект клиента (сервер и клиент у меня находятся в отдельных проектах InteliJ IDEA)
Мои классы требуют пакет javax.persistence.*. Ладно, подключил я либу и к клиенту хоть мне это и не нравится.
Еще проблема: объекты класса Group передаются по сети а при передачи объектов класса Member возникает ексцепшн:
Код

java.lang.ClassNotFoundException: org.hibernate.proxy.pojo.cglib.SerializableProxy
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    at java.lang.Class.forName0(Native Method) ....................................
        .........................................................................................................



--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
CrasyMen
Дата 26.4.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1. Правильно ли я сделал что просто скопировал файлы (классы) от сервера клиенту? Может это делается кок-то по-другому? Не нашел инфы об этом.
2. Правильно ли я сделал что передаю по сети объекты классов сущностей? 
3. Почему объекты класса Group передаются по сети без проблем, а при передачи объектов класса Member возникает ексцепшн (см. пост выше)?


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
Vasay
Дата 26.4.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Может Вам посмотреть в сторону RMI ( http://ru.wikipedia.org/wiki/RMI )


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
CrasyMen
Дата 26.4.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сколько времени надо чтобы разобраться с RMI для решения моей задачи?


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
Vasay
Дата 26.4.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Сколько времени надо чтобы разобраться с RMI для решения моей задачи? 


Не знаю, от Вас зависит.


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
CrasyMen
Дата 26.4.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

RMI пересылает по сети сериализованные объекты. Аналогично можно сделать и на сокетах, но придется повозиться с Object..Stream.

похоже вопросы №2 и №3 не решатся с помощью RMI


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
CrasyMen
Дата 26.4.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(CrasyMen @  26.4.2009,  14:47 Найти цитируемый пост)
3. Почему объекты класса Group передаются по сети без проблем, а при передачи объектов класса Member возникает ексцепшн (см. пост выше)? 

Там проблема с сериализацией. В классе Member есть поле group. Из-за него объекты некорректно сериализируются. Щас пробую переделать сериализацию. Пока не получается.

Это сообщение отредактировал(а) CrasyMen - 26.4.2009, 17:44


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
CrasyMen
Дата 27.4.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ладно. Буду передаваемые объекты переганять в колекцию строк перед отправкой.
Код

    public static List<List<String>> membersToList(List<Member> mmbrsList) {
        List<List<String>> members = new ArrayList<List<String>>();
        for (Member a : mmbrsList) {
            List<String> mmbrPropList = new ArrayList<String>();
            mmbrPropList.add(a.getId().toString());
            mmbrPropList.add(a.getFirstName());
            mmbrPropList.add(a.getLastName());
            mmbrPropList.add(a.getMiddleName());
            mmbrPropList.add(a.getNotes());
            if (a.getGroup() != null)
                mmbrPropList.add(a.getGroup().getId().toString());
            else
                mmbrPropList.add(null);

            members.add(mmbrPropList);
        }
        return members;
    }

Общение между сервером и клиентом думаю сделать в таком виде:
Код на сервере:
Код

String str = null;
            StringTokenizer st = null;
            while (!socket.isClosed()) {
                try {
                    str = br.readLine(); // пробуем прочесть.
                } catch (IOException e) {
                    socket.close(); // если не получилось - закрываем сокет.
                }
                System.out.println("The message: " + str);

                st = new StringTokenizer(str);
                String str1 = st.nextToken();    // указывает что будем делать (delete, update, ...)
                String str2 = st.nextToken();    // указывает с какими объектами будем работать
                if (str1.equals("delete")) {
                    if (str2.equals("category")) {
                        ctgList = (List<List<String>>) objectInputStream.readObject();
                        // превращаем List<List<String>> в List<Category>
                        // делаем операцию "delete" в БД
                    } else if (str2.equals("book")) {
                         ................................
                    } else if (str2.equals("group")) {
                         ................................
                    } else if (str2.equals("member")) {
                         ................................
                    } else if (str2.equals("card")) {
                         ................................
                    }
                } else if (str1.equals("update")) {                    
                    ..................................
                } else if (str1.equals("add")) {
                    .....................................
                }

Нормально так делать?


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
CrasyMen
Дата 28.4.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может быть я невнятно объяснил суть вопроса? Недоумеваю почему тишина.


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
COVD
Дата 28.4.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



вот это сообщение на клиенте ? - 
Цитата

java.lang.ClassNotFoundException: org.hibernate.proxy.pojo.cglib.SerializableProxy

наверное, надо отменять в hibernate режим lazy инициализации, чтобы он не модифицировал ваш обьект. 

Это сообщение отредактировал(а) COVD - 28.4.2009, 21:35
PM MAIL   Вверх
CrasyMen
Дата 28.4.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



COVD, спасибо. Ловите плюсик. Надо же. Я думал я подключил ее, даже выше об этом писал. 


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
COVD
Дата 28.4.2009, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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

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


 




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


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

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