这是 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<Trip>
行程必须与另一表中的内容相对应。我建议:
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 关系还是有另一种映射方式?的主要内容,如果未能解决你的问题,请参考以下文章