почему hibernate заставляет сериализацию в методе session.get - PullRequest
5 голосов
/ 10 июня 2010

Я вижу, что методы session.get () и load () hibernate принимают только сериализуемые объекты.

Согласно моему пониманию hibernate, он сгенерирует оператор SQL и отправит его в СУБД. Ему никогда не потребуется отправлять объект Java по сети.

Почему hibernate заставляет нас сериализоваться?

Ответы [ 4 ]

5 голосов
/ 10 июня 2010

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

Тогда я не смог найти абсолютную ссылку, но я думаю, что самый сильный аргумент:

  • Идентификаторы сущностей используются в качестве ключа для кэширования (первый уровень, второй уровень) и могут быть отправлены черезthe wire

Некоторые более слабые аргументы (или не аргументы вообще):

  • Сам Session может быть потенциально сериализован (например, храниться в HttpSession)
  • Hibernate нужен супертип для entityId (включая составной ПК)

Учитывая все это, я думаю, что имеет смысл заставить пользователей API передавать Serializable entityId, это позволяет не закрывать двери и избегать любых последующих ограничений (упс, вы не можете активировать кэширование второго уровня, потому что этот pk не Serializable).Это IMO гораздо лучшее дизайнерское решение, чем использование Object.И, честно говоря, я не вижу в этом никакого раздражения.

1 голос
/ 10 июня 2010

Это не совсем так. Из Javadoc подпись соответствующих методов:

public Object get(Class clazz, Serializable id) ...
public Object load(Class theClass, Serializable id) ...

(нерелевантные части и другие перегруженные версии для краткости опущены).

Таким образом, сущность должна бытьЗагруженный может быть любого класса, только его идентификатор должен быть сериализуемым.

Объекты действительно не могут быть сериализуемыми, согласно этой цитате из Сохранение Java с Hibernate , ch.13.3.2:

Постоянные экземпляры хранятся в кэше второго уровня в разобранном виде.Думайте о разборке как о процессе, похожем на сериализацию (однако алгоритм намного, намного быстрее, чем сериализация в Java).

Так что я бы предположил, что идентификаторы (в кеше запросов) также не сериализуются,Я не смог найти никакого объяснения, почему id объявлен Serializable, и без этого я могу только догадываться.Для API требуется тип для параметра id, который должен быть общим супертипом по крайней мере для часто используемых типов идентификаторов Number и String, и кроме Object, Serializable является единственным выбором.

0 голосов
/ 10 июня 2010

Честно говоря, я не вижу другого пути. Если вы не тот, кто определяет структуру таблицы и генерирует операторы вставки для размещения объектов, тогда сгенерированный оператор SQL является строкой сам по себе, и он вставит другую строку текста (ваши сериализованные данные) в поле таблицы. В этом случае все, что вы вставляете в базу данных, должно быть строкой, это не может быть объект с методами, зависящими от языка, если вы явно не разработали таблицу для хранения таких данных.

0 голосов
/ 10 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...