Получение типов Javassist вместо реальных типов объектов Hibernate - PullRequest
6 голосов
/ 07 декабря 2011

Я наткнулся на действительно раздражающую ситуацию: я использую Hibernate & Spring в качестве бэкэнда для своего приложения, и кажется, что в некоторых случаях сущности, которые находятся в связи с конкретной сущностью, не выбираются как обычные объекты сущности изБД, но как Javassist типов.Например:

У меня есть объект Campaign со следующими отношениями:

@Entity
@Table(name = "campaign")
public class Campaign implements Serializable {
  [..]
  @ManyToMany(fetch = FetchType.LAZY)
  @JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {
        "campaign_id", "dealer_id" }), name = "campaign_has_dealer", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "dealer_id", nullable = false) })
  private List<Dealer> dealers = new ArrayList<Dealer>();

@ManyToMany
// (fetch = FetchType.LAZY)
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {
        "campaign_id", "sales_area_id" }), name = "campaign_has_sales_area", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "sales_area_id", nullable = false) })
private List<SalesArea> salesAreas = new ArrayList<SalesArea>();
}

При получении salesAreas, связанных с этой кампанией, я получаю список SalesArea _ $$ _ javassist_56, а для дилеров, Я получаю нормальные спящие сущности.Поскольку клиентская часть основана на GWT, мы используем RequestFactory для извлечения материала.Сначала я думал, что это проблема с прокси, локаторами и т. Д., Но я установил точку останова в службе, где они извлекаются, и они являются объектами Javassist непосредственно после их выбора.Кажется, что даже удаляя аннотацию FetchType.LAZY (хотя это определенно нежелательное решение), происходит то же самое.Это произошло и с другими типами отношений, не только @ ManyToMany.

Мы используем GWT 2.3, Spring 3, Hibernate 3.6.3 и JPA 2.0 для аннотаций.

Любые предложения будут оценены.

Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Насколько я понимаю, большая проблема, с которой вы сталкиваетесь, заключается не столько в типе выборки вашей ассоциации, сколько в том, что прокси-типы не работают с RequestFactory.

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

Я не помню точно, как это решить, но я это сделал, и, насколько я помню, в классе ServiceLayerDecorator была точка расширения. По сути, вы проверяете, является ли возвращаемый объект прокси-сервером Hibernate (проверьте классы Hibernate и HibernateProxy), а затем возвращаете тип без прокси в ServiceLayerDecorator. (http://code.google.com/p/google-web-toolkit/issues/detail?id=6767)

Что касается вашей стратегии извлечения, я бы в значительной степени рекомендовал @BatchSize (N), где N большое (возможно, 1000), но это независимая тема.

Удачи!

1 голос
/ 18 февраля 2014

Если вы вызываете статический метод: HibernateProxyHelper.getClassWithoutInitializingProxy (entity);вы получаете класс проксируемой сущности и сам класс, если он не был проксирован.

0 голосов
/ 11 октября 2012

С прокси-моделью Hibernate и теперь с использованием Javassist, чтобы помочь избежать более медленных традиционных операций отражения во время выполнения Hibernate, вещи никогда не будут такими элегантными, как чистые, интуитивно понятные люди, использующие решения с полным расширением байт-кода, такие как реализации JDO (например,DataNucleus) наслаждайтесь.

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

Однако вернемся к вопросу: одним из решений вашей проблемы, если вы используете JPA, является использование DataNucleus / JPA, которое приносит много преимуществ DataNucleus / JDO (чистая базовая реализация -нет прокси, нет классов Javassist и т. д.) в реализации, совместимой с JPA, т. е. вам не нужно менять существующий исходный код, чтобы начать его использовать.

...