首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多对多集合添加条目- org.hibernate.HibernateException:找到对集合的共享引用:

多对多集合添加条目- org.hibernate.HibernateException:找到对集合的共享引用:
EN

Stack Overflow用户
提问于 2014-10-01 23:09:13
回答 1查看 506关注 0票数 0

我只需要使用名为SongsPlaylisthibernate (将歌曲与播放列表相关联)在多对多表/对象上添加一个条目。

表的结构定义如下:Songs---->SongPlaylist<----Playlists

映射文件(省略了文件的不重要部分):

代码语言:javascript
复制
<hibernate-mapping>
    <class name="model.pojo.Songs" table="songs" catalog="dbname" lazy="false">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <set name="songsPlaylists" table="songs_playlist" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="song" not-null="true" unique="true" />
            </key>
            <one-to-many class="model.pojo.SongsPlaylist" />
        </set>
    </class>
</hibernate-mapping>
<!-- Generated 24-set-2014 8.40.14 by Hibernate Tools 3.6.0 -->
<hibernate-mapping>
    <class name="model.pojo.SongsPlaylist" table="songs_playlist" catalog="dbname" lazy="false">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <many-to-one name="songs" class="model.pojo.Songs" fetch="select">
            <column name="song" not-null="true" unique="true" />
        </many-to-one>
        <many-to-one name="playlists" class="model.pojo.Playlists" fetch="select">
            <column name="playlist" not-null="true" unique="true" />
        </many-to-one>
    </class>
</hibernate-mapping>

<!-- Generated 24-set-2014 8.40.14 by Hibernate Tools 3.6.0 -->
<hibernate-mapping>
    <class name="model.pojo.Playlists" table="playlists" catalog="dbname" lazy="false">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <set name="songsPlaylists" table="songs_playlist" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="playlist" not-null="true" unique="true" />
            </key>
            <one-to-many class="model.pojo.SongsPlaylist" />
        </set>
    </class>
</hibernate-mapping>

pojo类:

代码语言:javascript
复制
public class SongsPlaylist  implements java.io.Serializable {
     private Integer id;
     private Songs songs;
     private Playlists playlists;
     (...)
}

public class Songs  implements java.io.Serializable {
     private Integer id;
     private Set songsPlaylists = new HashSet(0);
     (...)
}

public class Playlists  implements java.io.Serializable {
     private Integer id;
     private Set songsPlaylists = new HashSet(0);
     (...)
}

这是我的函数

代码语言:javascript
复制
            s = new HibernateUtil().getSessionFactory().openSession();
            transaction = s.beginTransaction();
            (...)
                q = s.createQuery("select sp from SongsPlaylist sp where sp.playlists = :p");
                q.setParameter("p", p);
                sp = q.list();
                //already exists a song binded to that playlist
            if(sp.size()>0){
                Set<Playlists> sP = sp.get(0).getPlaylists().getSongsPlaylists();
                sP.add(p);
                song.setSongsPlaylists(sP);
                s.save(s);
            }else{
                //or it is in another playlist...
                q = s.createQuery("select sp from SongsPlaylist sp where sp.songs = :s");
                q.setParameter("s", song);
                sp = q.list();
                if(sp.size()>0){
                    Set<Songs> sP = sp.get(0).getSongs().getSongsPlaylists();
                    sP.add(song);
                    p.setSongsPlaylists(sP);
                    s.save(p);
                }else{
                    s.save(new SongsPlaylist(song, p));
                }
            }
            }
            transaction.commit();
            s.close();

并且它停顿在transaction.commit(); (最后一行)上

代码语言:javascript
复制
org.hibernate.HibernateException: Found shared references to a collection: 
model.pojo.Songs.songsPlaylists

在持久对象上持久化Set<Playlists (当我尝试用Set<Songs>做同样的事情)时,看起来我做了一些错误的事情。对于这种情况,为了插入"SongPlaylist“并避免前面提到的hibernate异常,最佳实践是什么?

EN

回答 1

Stack Overflow用户

发布于 2014-10-02 23:26:52

找到了解决方案..。

在else块中(而不是我所写的代码),现在是:

代码语言:javascript
复制
Set<Playlists> sP = song.getPlaylistses(); // terrific netbeans naming when automatic pojo mapping :-)
sP.add(p);
song.setPlaylistses(sP);
s.save(song);

这只是一个小问题,和这个无关,但是

SongsPlaylist不应该是hbm文件。hibernate映射应该改为

代码语言:javascript
复制
<hibernate-mapping>
    <class name="model.pojo.Songs" table="songs" catalog="dbname" lazy="false">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        (...)
        <set name="playlistses" table="songs_playlist" inverse="false" lazy="false" fetch="select">
            <key>
                <column name="song" not-null="true" />
            </key>
            <many-to-many entity-name="model.pojo.Playlists">
                <column name="playlist" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>


<hibernate-mapping>
    <class name="model.pojo.Playlists" table="playlists" catalog="dbname" lazy="false">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <set name="songses" table="songs_playlist" inverse="false" lazy="false" fetch="select">
            <key>
                <column name="playlist" not-null="true" />
            </key>
            <many-to-many entity-name="model.pojo.Songs">
                <column name="song" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26144540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档