java jpa set_java – JPA OneToMany:List vs Set

我不久以前就面对这个问题

简而言之:

> Bag语义 – >列表/集合@OneToMany – >添加一个元素:1个删除,N个插入,一个元素已删除:1个删除,N个插入

>列表语义 – >列表@OneToMany @IndexColumn / @OrderColumn – >添加一个元素:1插入,M更新,删除一个元素:1删除,M更新

>设置语义 – >设置@OneToMany – >添加一个元素:1插入,删除一个元素:1删除

对我来说:是的,这意味着你必须将List设置为单向@OneToMany.所以我改变了我的模型,以符合Hibernate的期望,并且导致了很多问题,因为视图部分的应用程序依赖于List …

一方面,集合对我来说是一个合理的选择,因为没有重复,另一方面,列表更容易处理.

所以JPA / Hibernate强制我改变模型对象,这不是第一次,当你使用@EmbededId你可能不会做同样的方式没有JPA / Hibernate.当你必须在所有应用程序中注意到HibernateProxy,特别是在equals方法中… else if(object instanceof HibernateProxy){…,你注意到JPA / Hibernate的persitence层在其他层中有点侵入性.

但是当我直接使用JDBC时,我也使用改变模型或者改进方法来促进持久化…

层隔离可能是一个梦想,或成本太高,100%可以完成?

如果它们是SortSetSet,那么您可以订购一个Set,如TreeSet,带有注释@OrderBy

当某些代码依赖于列表而无法更改(例如JSF / PrimeFaces< dataTable>或< repeat>组件)时,会带来问题

因此,您必须将“设置为列表”更改为“设置”,但如果您设置了“新建HashSet(通知列表)”),则将会有额外的查询,因为该集合是由Hibernate管理的org.hibernate.collection.PersistentSet.所以我使用addAll()和removeAll()而不是setter:

protected void updateCollection(@NonNull Collection oldCollection, @NonNull Collection newCollection) {

Collection toAdd = new ArrayList<>(newCollection) ;

toAdd.removeAll(oldCollection) ;

Collection toRemove = new ArrayList<>(oldCollection) ;

toRemove.removeAll(newCollection) ;

oldCollection.removeAll(toRemove) ;

oldCollection.addAll(toAdd) ;

}

记住你的@Entity的equals()和hashCode()方法…

另一个问题是,如果您希望使用JPA与Hibernate作为实现,则需要掌握JPA和Hibernate,因为Set / List / Bag语义来自Hibernate不是来自JPA(如果我错了,请纠正我)

一个规范用于将实现抽象为不依赖于一个特定的供应商.虽然大部分的JavaEE规范都成功了,但JPA对我来说是失败的,我放弃了独立于Hibernate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值