2012-05-03 1 views
0

У меня сейчас проблема, и я подумал, что некоторые из вас, ребята, могут мне помочь. Я занимаюсь разработкой приложений с помощью пружинного и Hibernate, и мой вопрос заключается в следующем:Spring, Hibernate и несколько ссылок на одну и ту же строку в базе данных

- Я сначала создать новый объект аудиофайла (класс домена) в моем главном объекте, а затем вставьте его в базе данных с помощью hibernateTemplate .save (audioFile) в DAO.

- Затем я использую метод DAB для hibernateTemplate.get (1) для извлечения строки из базы данных и сохранения экземпляра в объект audioFile1. (Типа аудиофайл)

- то я повторить шаг 2 и хранить экземпляр в объект audioFile2.

В итоге: мой основной класс выглядит следующим образом:

ApplicationContext context = new ClassPathXmlApplicationContext(
       "application-context.xml"); 
AudioFileServices audioFileServices = (AudioFileServices) context.getBean("audioFileServices"); 

AudioFile audioFile = new AudioFile(); 
audioFile.setAlbum("test"); 
audioFile.setArtist("test"); 
audioFile.setLength(1); 
audioFile.setPath("test"); 
audioFile.setTitle("test"); 

AudioFile a1 = null; 
AudioFile a2 = null; 

try { 
    audioFileServices.saveAudioFile(audioFile); 
    a1 = audioFileServices.getAudioFile(audioFile.getIdAudioFile()); 
    a2 = audioFileServices.getAudioFile(audioFile.getIdAudioFile()); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

ВОПРОС: Оба audioFile1 и audioFile2 представляют один и тот же объект, (в той же строке в базе данных), однако, они являются два разные экземпляры, а не два объекта, ссылающиеся на один и тот же экземпляр. (Как мне бы хотелось) Поэтому любая модификация, сделанная для первого объекта, не влияет на вторую. (Несмотря на то, что оба они сопоставлены с одной и той же строкой базы данных)

Я правильно настроил контекст приложения для вставки компонента AudioFileDAO в компонент AudioFileService и использую архитектуру уровня сервиса. Все работает отлично, за исключением этой досадной проблемы. Я также создал транзакции, и я использую компонент sessionFactory, который также добавляется в компонент AudioFileDAO по версии SPRING.

Вы знаете, что мне не хватает здесь? Может быть, это проблема конфигурации HIBERNATE? Любые идеи?

Заранее спасибо. (Я могу предоставить копию моего контекста приложения, сервиса и дао, если необходимо)

ответ

0

Как насчет набора a2 = a1, вместо того, чтобы получать из метода getAudioFile.

+0

Привет, Гари, Спасибо за ваш ответ. Моя проблема заключается в том, что в этом примере я использую только основной класс, чтобы разоблачить мою проблему, но на самом деле я разрабатываю приложение Swing с несколькими представлениями и контроллером. Затем конкретный звуковой файл может быть извлечен из разных представлений, которые не имеют ссылок друг на друга, и поэтому я не могу использовать set a2 = a1, хотя он является первопричиной всех экземпляров, ссылающихся на эту же строку в ссылке базы данных на тот же экземпляр. – user1373769

0

Возможно, это связано с тем, что Hibernate не кэширует извлеченные экземпляры ваших объектов. Я бы посмотрел Hibernate Configuration

+0

Спасибо, я сейчас смотрю. Однако при извлечении моих аудиофайлов в моем реальном приложении я извлекаю их на основе списка воспроизведения (также таблицы), в котором они содержатся. (Один аудиофайл может содержаться в нескольких списках воспроизведения). Это значит, что мои запросы не findAudioFile (idAudioFile), а findAudioFilesOfPlaylist (idPlaylist). (возвращает список). Это означает, что один и тот же audioFile может быть получен из запроса метода findAudioFilesPerPlaylist в списке воспроизведения1 и списка воспроизведения. Будет ли в кэше учитывать, что он возвращает тот же объект? Или он основан на фактическом запросе?Спасибо – user1373769

+0

Я не famailiar с настройками cahe, но я думаю, что в этом случае ваш 'List ' в обоих плейлистах будет содержать ссылку на ту же песню. Предполагается, что у вас есть таблица соединений, в которой есть playlist_id и song_id. – Kodi

+0

да, у меня есть таблица соединений, чтобы сделать это. Я пробовал реализовать кеш второго уровня с hibernate и даже несмотря на то, что он работает (он только делает запрос SELECT один раз, когда запрашивается первый запрос, а затем извлекает значение объекта из кэша при запросе второго запроса), он не возвращает ссылку на тот же объект. Кэш фактически не хранит ссылку на объект домена, извлеченный из БД, а только значения его отображаемых атрибутов. (Столбцы) Таким образом, у меня все еще есть одна и та же проблема. Она также работает только в том случае, если второй запрос совпадает с первым. – user1373769

Смежные вопросы