Хлопоты с Hibernate и Spring и динамическими прокси - PullRequest
0 голосов
/ 22 декабря 2009

Я хотел бы реализовать что-то вроде шаблона PDO в сочетании с Spring. Все доменные объекты реализованы в соответствии с их интерфейсом. Каждая реализация объекта домена также имеет автоматическую реализацию DAO, чтобы иметь возможность напрямую сохранять объект. (например, foo.persist ()). Это работает довольно хорошо, Spring также вставляет правильную реализацию DAO.

Чтобы создать эти bean-компоненты, я реализовал BeanFactory, которая просто создает Bean-компоненты с помощью Spring. Тем не менее, Spring создает Dynamic Proxies, и здесь начинается проблема. Когда у меня есть отношение многие-к-одному, я получаю два разных объекта Dynamic Proxy. При сохранении Hibernate говорит мне:

"не удалось получить значение поля по получателю отражения".

Интерфейс этих двух объектов определяется следующим образом:

public interface Client {
 public Long getId();
 public void setId(Long id);
}

Интерфейс пользователя определяется следующим образом:

public interface User {
 public Long getId();
 public Client getClient();
 public void setClient(Client client);
 public void setId(Long id);
}

Реализация User выполнена в соответствии с JPA, я использовал тег targetEntity для ссылки на правильную реализацию объекта Client. Тем не менее, сохранение не работает при вставке объекта Client, который был создан с помощью Spring. Надеюсь, что кто-то с вашей стороны может помочь в решении этой проблемы.

Привет

Matthias

1 Ответ

2 голосов
/ 22 декабря 2009

Вы просто не помещаете свои доменные объекты в контекст весны. Это анти-паттерн. Spring не нуждается в управлении объектами домена.

Как вы создаете такой объект? Позвонив context.getBean() или введя их. Первый случай ужасен (и требует, чтобы доменные объекты имели область действия prototype, последний просто не будет работать, потому что область действия по умолчанию для всех bean-компонентов singleton - т.е. вы будете получать один и тот же объект каждый раз. В противном случае вам потребуется, чтобы все ваши bean-компоненты имели область действия prototype, чтобы иметь новый экземпляр объекта домена.

Отделяйте DAO от объектов вашего домена - это обязательно. Доменные объекты должны быть не более чем аннотированными POJO - интерфейс не нужен (в общем случае).

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

Если вы используете (в вашем applicationContext.xml)

<aop:config proxy-target-class="true">
</aop:config>

Тогда ваши классы будут расширены CGLIB (вместо динамических прокси), и их свойства и методы, скорее всего, будут сохранены. Но имейте в виду, что это просто неправильно.

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