gpt4 book ai didi

java - Hibernate:如何正确映射包含多对一的复合元素的集合?

转载 作者:太空宇宙 更新时间:2023-11-04 06:26:52 24 4
gpt4 key购买 nike

我有一个类似于以下的映射:

<set name="tracks" table="tracks">
<key column="album_id" />
<composite-element class="Track">

<many-to-one name="song" column="song_id" class="Song" cascade="none" />

<property name="trackNumber" column="track_number" type="java.lang.Integer" not-null="false"/>
</composite-element>
</set>

通常,对于与此类似的映射,我注意到在保存父实体时,Hibernate 喜欢先删除集合中的所有元素,然后再添加回新元素。我已经开始接受这是标准行为。

但是,使用上面给出的映射文件,我遇到了一个似乎有两倍的错误。

首先,Hibernate 似乎试图通过使用跟踪表上的每一列 发出 DELETE 语句来删除集合的元素。其次,只要 trackNumber 为 null,这仍然会失败,因为 DELETE 语句包含

DELETE FROM track WHERE album_id = ? AND song_id = ? AND track_number = ?

这根本不会删除轨道。它确实应该为 null 做,a

DELETE FROM track WHERE album_id = ? AND song_id = ? AND track_number is ?

无论哪种方式,我真正喜欢的是像这样简单的东西

DELETE FROM track WHERE album_id = ?

当我用 Song_id 替换多对一映射时,这似乎有效

<set name="tracks" table="tracks">
<key column="album_id" />
<composite-element class="Track">

<property name="songId" column="song_id" type="int" />

<property name="trackNumber" column="track_number" type="java.lang.Integer" not-null="false"/>
</composite-element>
</set>

但我也需要轨迹数据...有什么帮助吗?

编辑:

也许我应该澄清我的问题。

如何才能使我在此集合上的删除不依赖于 trackNumber?

最佳答案

Hibernate 使用所有列发出删除,因为您正在使用元素集合。

如果您希望它仅使用 album_idtrack_id,则需要将其定义为实体集合。对于此实体,您使用 album_idtrack_id复合 ID。 Tracknumber 然后就变成您实体的一个值。

<set name="tracks" table="TRACK">
<key column="album_id"/>
<one-to-many class="Track"/>
</set>

<class name="Track">
<composite-id>
<key-many-to-one name="album" class="Album" column="album_id"/>
<key-many-to-one name="song" class="Song" column="song_id"/>
</composite-id>
<property name="trackNumber" column="track_number" />
</class>

当然,为此,我建议使用列表而不是集合。这样您就可以使用列表的索引作为您的 trackNumber。

关于java - Hibernate:如何正确映射包含多对一的复合元素的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26682102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com