【问题标题】:Spring, Hibernate and multiple references to the same row in databaseSpring,Hibernate和对数据库中同一行的多次引用
【发布时间】:2012-05-03 22:51:18
【问题描述】:

我目前在这里遇到问题,我想也许你们中的一些人可以帮助我。 我正在使用 SPRING 和 HIBERNATE 开发应用程序,我的问题如下:

1 - 我首先在我的主对象中创建一个新的 AudioFile 对象(域类),然后使用 DAO 中的 hibernateTemplate.save(audioFile) 方法将其插入到数据库中。

2 - 然后我使用 DAO 的 hibernateTemplate.get(1) 方法从数据库中检索行,并将实例存储到 audioFile1 对象中。 (音频文件类型)

3 - 然后我重复 步骤 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 bean 注入 AudioFileService bean 并使用服务层架构。除了这个烦人的问题外,一切都完美无缺。我还设置了事务,并且正在使用由 SPRING 注入 AudioFileDAO bean 的 sessionFactory bean。

你们中有人知道我在这里缺少什么吗?也许这是一个 HIBERNATE 配置问题? 有什么想法吗?

提前谢谢你。 (如果需要,我可以提供我的应用程序上下文、服务和 dao 代码的副本)

【问题讨论】:

    标签: spring hibernate orm reference instance


    【解决方案1】:

    如何设置 a2 = a1,而不是从方法 getAudioFile 获取。

    【讨论】:

    • 嗨,加里,谢谢您的回答。我的问题是,在这个例子中我只使用主类来暴露我的问题,但我实际上正在开发一个具有多个视图和控制器的 Swing 应用程序。然后可以从彼此没有链接的不同视图中检索特定的音频文件,因此我不可能使用 set a2 = a1 尽管它是原始的所有实例都在数据库中引用同一行引用同一实例。
    【解决方案2】:

    这可能是因为 Hibernate 没有缓存检索到的对象实例。我会调查Hibernate Configuration

    【讨论】:

    • 谢谢,我正在看。但是,在我的实际应用程序中检索我的音频文件时,我根据它们包含的播放列表(也是一个表)来检索它们。(一个音频文件可以包含在多个播放列表中)这意味着我的查询不是 findAudioFile(idAudioFile) 而是 findAudioFilesOfPlaylist( idPlaylist)。 (返回一个列表)这意味着可以通过查询 playlist1 和 playlist2 的 findAudioFilesPerPlaylist 方法来检索相同的音频文件。缓存是否考虑到它返回相同的对象?还是根据实际查询?谢谢
    • 我不熟悉 cahe 设置,但我认为在这种情况下,您的两个播放列表中的 List<Song> 将包含对同一首歌曲的引用。这假设您有一个包含 playlist_id 和 song_id 的连接表。
    • 是的,我有一个连接表来执行此操作。我尝试使用休眠实现二级缓存,即使它确实有效(它只在第一次执行 SELECT 查询时get 被请求,然后在请求第二个 get 时从缓存中检索对象的值)它不返回同一对象的引用。缓存实际上并不存储对从数据库检索到的域对象的引用,而只是存储其映射属性的值。 (列)因此我仍然有同样的问题。它也只有在第二个查询与第一个查询完全相同的情况下才有效。
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多