В Hibernate классы, на которые мепятся таблички, являются serializable

6yrop

?

katrin2201

Захочешь - будут, а по умолчанию - нет. Имхо, никаких препятствий.

6yrop

Захочешь - будут
если очень захотеть можно в космос полететь, вопрос в том насколько это просто и предусмотрено ли в идеологии Hibernate?

ava3443

вопрос в том насколько это просто и предусмотрено ли в идеологии Hibernate?
В некотором смысле это предусмотрено, так как Hibernate лучше всего работает с POJO (Plain Old Java Object которые обычно обладают конструктором без аргументов, а интерфейс java.io.Serializable как раз требует наличия такого конструктора.
А вообще, если такого конструктора не хочется, никто не мешает тебе добавить методы writeObject и readObject.
P.S. Если в чём ошибаюсь, поправьте меня.

katrin2201

ну как, пишешь implements Serializable, и полетел =)

Hastya

Гм, а что такого страшного в объявлении класса как Serializable?

puare

Да в принципе ничего...
Тема такая, что если Hibernate вызовы идут через RMI, то классы ОБЯЗАНЫ быть сериализуемыми насколько мне известно.
У тебя Hibernate как используется?

voronetskaya

Hibernate вызовы идут через RMI
чегоооо?

Hastya

Ну типа ты прав. Если тебя Hibernate вызовы идут через RMI, то объекты должны быть сериализуемыми. Только придется заодно тогда и Session, и Query сделать сериализуемыми.

6yrop

Session, и Query сделать сериализуемыми.
я даже Java толком не знаю (программирую на .Net тем белее Hibernate, но я предполагаю, что Session хранит соединение с базой, но в 3-х звенной архитектуре клиент не имеет соединение с базой
p.s. извиняюсь, если мое предположение не верно

6yrop

можно ли объекты-сущности Hibernate передавать через RMI? кто-нибудь так делал?

ava3443

если Hibernate вызовы идут через RMI
Можно тут поподробнее? Как и куда, а главное, зачем hibernate вызовы идут через RMI?

6yrop

я исхожу из аналогии с Remoting.Net
Как и куда, а главное, зачем вызовы идут через RMI?
на сколько я понимаю, hibernate создает коллекции объектов на основе данных из базы. Эти коллекции требуется передать на удаленного клиента.

Hastya

я даже Java толком не знаю (программирую на .Net
ну вот зачем тебе в таком случае сдался этот Hibernate? Я серьезно. Дальше будет только хуже.
Информация к размышлению: хибернейтовские коллекции могут существовать только в области действия сессии.

voronetskaya

сдается мне, ты написал фигню...
поясни плз, что в твоем понимании "хибернейтовские коллекции"?

Hastya

мое утверждение следует понимать как "в общем случае".
Хибернейтовские коллекции - см. раздел Collection Mapping в документации.

puare

Ну я например передаю по RMI Hibernate объекты в EJB, и это работатет только в том случае, если они сериализуемы
Hibernate collections отлично живут и без живой сессии (они становятся transient объектами потому как "generally, session reperesents single unit of work", т.е. сессию открыл, почитал/пописАл ей, и закрываем, потому как сессия строится на java.sql.Connection, а их в пуле все-таки ограниченное число. Рекомендовано почитать про Second-level Hibernate cache и вообще про архитектуру Hibernate. Если объекты не lazy-initialized, то вопрос с колекцией и сессие сам по себе отпадает.
Далее относительно сериализуемости сессии - "A Session instance is serializable if its persistent classes are serializable". RTFM JavaDoc!

puare

В Hibernate классы, на которые мепятся таблички, являются serializable
В hibernate, кстати, все происходит совсем наоборот - объекты мапятся на таблички, более того, на тему структуры БД можно не парится, потому как есть стандартный anttask для генерации структуры базы по маппингам.

voronetskaya

С объектами-сущностями ты можешь делать что угодно. К ним требований, в сущности, два - конструктор без параметров и идентификатор(первичный ключ). И нет никаких помех делания их Serializable и передаче их через RMI.
Только обязательно прочитать вот эту главу, чтобы уяснить обращение хибернейта с сущностями в разных сессиях.

voronetskaya

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

Hastya

Если объекты не lazy-initialized, то вопрос с колекцией и сессие сам по себе отпадает.
Про это я и говорю. Если у тебя этот вопрос отпадает, считай, что тебе повезло.
A Session instance is serializable if its persistent classes are serializable
Как это ты себе семантику сериализации сессии представляешь?

voronetskaya

на тему структуры БД можно не парится, потому как есть стандартный anttask для генерации структуры базы по маппингам
угу, тока это в идеальном мире... обычно структура уже есть, и как раз надо париться чтобы положить на нее свои бизнес-объекты... хотя и для этого есть тулзы, вопрос тока в том как они работают :-\
это не говоря уже о том что структура бд все-таки должна считаться с общим перфомансом системы.

puare

Только обязательно прочитать вот эту главу, чтобы уяснить обращение хибернейта с сущностями в разных сессиях
разделение объектов между сессиями? transient and persistent objects? ну там все не очень заморочено, я бы даже сказал, все более или менее логично. Гораздо дольше заморочек там в наследованием (особенно множественым) и lazy loading.

puare

Про это я и говорю. Если у тебя этот вопрос отпадает, считай, что тебе повезло
Почитай, что я до этого писал. Даже если объекты lazy, все работатет хорошо, поверь.
Как это ты себе семантику сериализации сессии представляешь
Если кэш первого уровня (сессионный) сериализуется, то и вся сессия сериализуется. А кэш сериализуется тогда, когда все объекты в нем сериализуются. Элементарно. Хотя, возможно, я не очень понял значение слова "семантика" в данном контексте.

puare

хотя и для этого есть тулзы
MiddleGen например. Рабоатет без особых проблем афаик.

Hastya

Даже если объекты lazy, все работатет хорошо, поверь.
Если есть ассоциированная открытая сессия - работает, я и не спорю.
Если кэш первого уровня (сессионный) сериализуется, то и вся сессия сериализуется. А кэш сериализуется тогда, когда все объекты в нем сериализуются. Элементарно.
Для начала, представь как будут dirty checks происходить, а также семантику работающих в этом случае транзакций. Желание сериализовать сессию сразу отпадет

puare

Для начала, представь как будут dirty checks происходить
На уровне кэша второго уровня
а также семантику работающих в этом случае транзакций
модификация persistent-layer объекта происходит только в рамках открытой сессии, там с транзакциями все ок
вообще, сессию сериализуют для того, чтобы передавать ее по RMI к примеру. Т.е. есть некий Locator для нее, который кроме всего прочего морочится на тему потоков (потому как Session НЕ ЯВЛЯЕТСЯ threadsafe и для передачи сессии в бины к примеру требуется сериализуемость сессии

Hastya

модификация persistent-layer объекта происходит только в рамках открытой сессии, там с транзакциями все ок
че-то я не понял. так ты только закрытые сессии сериализуешь? а нафига? и никаких объектов там нет в таком случае...
Т.е. есть некий Locator для нее, который кроме всего прочего морочится на тему потоков (потому как Session НЕ ЯВЛЯЕТСЯ threadsafe и для передачи сессии в бины к примеру требуется сериализуемость сессии
Господи, Какой Ужас. У меня нет слов.

puare

че-то я не понял. так ты только закрытые сессии сериализуешь? а нафига? и никаких объектов там нет в таком случае...
дяденька! как вы себе представляете скажем 3tier систему с большой нагрузкой, у которой постоянно держатся открытые сессии хибернейта на каждую открытую сессию клиента? Это ж какой емкости connection pool должен быть?!
закрытые сессии никому не нужны нафик. вот сессии с закрытыми connection еще можно использовать некоторым образом.
Господи, Какой Ужас. У меня нет слов
Про что нет слов? Про масштабируемость и прочие радости наверное слышали? Связи не видите? Если нет, то не стоит дисскутировать в таком случае, если да - то не потрудитесь ли объяснить, чем вызвана такая реакция?

voronetskaya

сессии с закрытыми connection еще можно использовать
смахивает на какое-то грязное извращение...
слушай, опиши плз в двух словах свою систему, а? а то пока как-то непонятно для чего ты хибернейт используешь, и есть стойкое ощущение(пока не очень обоснованное) что ты его там используешь не по назначениею :-\

puare

смахивает на какое-то грязное извращение
я говорил, что это не извращение? Я говорил, что это в принципе можно делать, но не то, что я так делаю.
опиши плз в двух словах свою систему
трехзвенка, веб интерфейс на struts и своих разработках, бизнес-логика на Stateless Sesion бинах, Hibernate для ORM объектов бизнес-логики, используется из бинов. В данный момент прикручиваю аспекты на эту систему.
используешь не по назначениею
типа булочки печь? Hibernate трудно использовать не по назначению имхо

Hastya

Ты не виляй из стороны в сторону. Сериализуешь и десериализуешь сессию с закрытым коннектом? Я правильно понял? Тогда проблем с транзакциями и с версионностью ты, возможно, избежишь, только вот непонятно, нахрена нужна такая сессия.
Про что нет слов? Про масштабируемость и прочие радости наверное слышали? Связи не видите? Если нет, то не стоит дисскутировать в таком случае, если да - то не потрудитесь ли объяснить, чем вызвана такая реакция?
Да, ты знаешь, я "кое-что" слышал про масштабируемость, поэтому до такой вещи как передача сессии по RMI в бины, я, наверное, никогда не додумаюсь.

puare

Сериализуешь и десериализуешь сессию с закрытым коннектом? Я правильно понял?
нет. сессию вообще руками не сериализую и не десериализую. ни с открытым коннектом, ни с закрытым.
поэтому до такой вещи как передача сессии по RMI в бины, я, наверное, никогда не додумаюсь
я тоже не передаю сессию в бины. С чего ты это взял? С того, что я написал "к примеру"? Сам же спрашивал, нахрена нужны сериализуемые сессии. Я тебе привел пример, но при этом не утверждал, что я так делаю.
Все, dixi.
Оставить комментарий
Имя или ник:
Комментарий: