没有双向实体的 Hibernate 关系问题
Hibernate relationship issues on no bidirectional entities
你好,我有一个实体
OfferItem与这两个关系manyToOne
@ManyToOne
@JoinColumn(name = "offer_id", nullable = false, insertable = false, updatable = false)
@XmlTransient
@Getter
@Setter
private Offer offer;
@ManyToOne
@JoinColumn(name = "item_id", nullable = false, insertable = false, updatable = false)
@XmlTransient
@Getter
@Setter
private Item item;
以及数据库上的外键配置
<addForeignKeyConstraint baseTableName="offer_item"
baseColumnNames="item_id"
constraintName="item_offer_item_fk"
referencedTableName="item"
onDelete="CASCADE" onUpdate="CASCADE"
referencedColumnNames="id"/>
<addForeignKeyConstraint baseTableName="offer_item"
baseColumnNames="offer_id"
constraintName="offers_offer_item_fk"
onDelete="CASCADE" onUpdate="CASCADE"
referencedColumnNames="id"
referencedTableName="offer"/>
与报价的关系是双向的,因此在报价实体上我与 OfferItem 有这种关系
@OneToMany(orphanRemoval = true, cascade = {CascadeType.ALL})
@JoinColumn(name = "offer_id", nullable = false)
@XmlElementWrapper
@Getter
private List<OfferItem> offerItems = new ArrayList<>();
在项目上我没有双向关系,因为没有必要。
现在的问题是,当我在 OfferItem 上制作 Item 集时,我将 offerItem 添加到 OfferItems 列表中,然后保存 Offer。我可以看到 offerItem id 是如何生成的,因为它在级联上持久存在。但是 offerItem 和 item 之间的 link 丢失了。
我只是尝试在 OfferItem 上设置项目并用他自己的服务保存实体,但没有。我不能在他们之间坚持这个link。
任何想法或建议。
此致。
从连接列中删除 insertable = false, updatable = false
。此外,offerItems
的映射是错误的。应该是
@OneToMany(orphanRemoval = true, cascade = {CascadeType.ALL}, mappedBy = "offer")
@XmlElementWrapper
@Getter
private List<OfferItem> offerItems = new ArrayList<>();
你好,我有一个实体
OfferItem与这两个关系manyToOne
@ManyToOne
@JoinColumn(name = "offer_id", nullable = false, insertable = false, updatable = false)
@XmlTransient
@Getter
@Setter
private Offer offer;
@ManyToOne
@JoinColumn(name = "item_id", nullable = false, insertable = false, updatable = false)
@XmlTransient
@Getter
@Setter
private Item item;
以及数据库上的外键配置
<addForeignKeyConstraint baseTableName="offer_item"
baseColumnNames="item_id"
constraintName="item_offer_item_fk"
referencedTableName="item"
onDelete="CASCADE" onUpdate="CASCADE"
referencedColumnNames="id"/>
<addForeignKeyConstraint baseTableName="offer_item"
baseColumnNames="offer_id"
constraintName="offers_offer_item_fk"
onDelete="CASCADE" onUpdate="CASCADE"
referencedColumnNames="id"
referencedTableName="offer"/>
与报价的关系是双向的,因此在报价实体上我与 OfferItem 有这种关系
@OneToMany(orphanRemoval = true, cascade = {CascadeType.ALL})
@JoinColumn(name = "offer_id", nullable = false)
@XmlElementWrapper
@Getter
private List<OfferItem> offerItems = new ArrayList<>();
在项目上我没有双向关系,因为没有必要。
现在的问题是,当我在 OfferItem 上制作 Item 集时,我将 offerItem 添加到 OfferItems 列表中,然后保存 Offer。我可以看到 offerItem id 是如何生成的,因为它在级联上持久存在。但是 offerItem 和 item 之间的 link 丢失了。
我只是尝试在 OfferItem 上设置项目并用他自己的服务保存实体,但没有。我不能在他们之间坚持这个link。
任何想法或建议。
此致。
从连接列中删除 insertable = false, updatable = false
。此外,offerItems
的映射是错误的。应该是
@OneToMany(orphanRemoval = true, cascade = {CascadeType.ALL}, mappedBy = "offer")
@XmlElementWrapper
@Getter
private List<OfferItem> offerItems = new ArrayList<>();