这是 ManyToMany JPA/Hibernate 关系还是有另一种映射方式?

Posted

技术标签:

【中文标题】这是 ManyToMany JPA/Hibernate 关系还是有另一种映射方式?【英文标题】:Is this a ManyToMany JPA/Hibernate relationship or there is another way to map this? 【发布时间】:2009-09-15 20:34:36 【问题描述】:

我开始使用 JPA 并创建了以下(简化的)表;

airport
--------
id (pk)
city
code
...

trip
--------
id (pk)
originAirport_id  (fk)
destinationAirport_id  (fk)
...

我正在尝试在 JPA/Hibernate 中映射它。

在我的旅行对象中,我创建了 2 个机场对象:

private Airport airportFrom;
private Airport airportTo;

我这样注释吸气剂:

    @ManyToOne
public Airport getAirportFrom() 
    return airportFrom;


    @ManyToOne
public Airport getAirportTo() 
    return airportTo;

在我的 Airport 课程中,我创建了一个“旅行”对象的 HashSet

    private Set <Trip> trips = new HashSet<Trip>();

并注释了getter:

    @OneToMany (mappedBy="airport")
public Set <Trip> getTrips() 
    return trips;

这在 SQL 中很容易实现,但我不知道如何在 JPA/Hibernate 中注释和实现这种关系。

有什么建议吗?

【问题讨论】:

+1 解释清楚的问题 【参考方案1】:

我相信你错过了一个小细节。在 Airport 类中,您拥有的 Set&lt;Trip&gt; 行程必须与另一表中的内容相对应。我建议:

    public class Airport 
       private Set<Trip> fromTrips = new HashSet<Trip>();
       private Set<Trip> toTrips = new HashSet<Trip>();

       @OneToMany (mappedBy="airportFrom")
       public Set <Trip> getFromTrips() 
          return fromTrips;
       
       @OneToMany (mappedBy="airportTo")
       public Set <Trip> getToTrips() 
          return fromTrips;
       

    

“mappedBy”必须指向 Many 类中的属性名称。在这里,Trip 中的两个属性是 airportFrom 和 airportTo。

所以你有两组行程,fromTrips 和 toTrips。我希望你对此没问题?


已编辑,在 ChssPly76 的出色评论之后,这应该是一个自己的答案。我会投票给它:-)

如果关联需要是双向的,那就是映射它的方法。不过,我不确定它是否必须是 - 机场没有处理旅行集合的业务。考虑改为单向关联,并在/如果您需要查找从/到相关机场的所有行程时使用查询(您也可以通过这种方式获得单个列表)。

【讨论】:

+1。如果关联需要是双向的,那就是映射它的方式。不过,我不确定它是否必须是 - 机场没有处理旅行集合的业务。考虑改为单向关联,并在/如果您需要查找从/到相关机场的所有行程时使用查询(您也可以通过这种方式获得单个列表) @ChssPly76 优秀的评论,我同意。我在回答中包含了您的评论。如果你想让它成为一个单独的答案,我认为它应该得到它,我会把它拿走。无论如何,我为你投了 +1 票,这是你应得的。 KLE 提供的解决方案有效,尽管 ChssPly76 指出我不应该需要它。在阅读一本 Hibernate 书籍时,我发现了注释“hibernate 初学者最常犯的错误之一是尝试在任何地方使用双向映射。”这正是我所做的。术语“MappedBy”、“Inverse”和“Owning”实体也是一个很大的混淆来源(因为我发现在其他地方阅读了几个相互矛盾的帖子)。长话短说,“MappedBy”注释应该放在“One”一侧,即数据库中没有外键的一侧。谢谢!

以上是关于这是 ManyToMany JPA/Hibernate 关系还是有另一种映射方式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Doctrine中查询关联id不相等的ManyToMany关系

没有反向关系的两个 ManyToMany 字段

@ManyToMany的学习

如何在typeORM中保存@ManyToMany中的关系

Hibernate:ManyToMany 反向删除

基于ManyToMany关系存在过滤Django QuerySet