2014-09-26 71 views
3

冬眠多对多用命令我有以下的DB设置:在jointable

T_PARTICIPANT_MOVEMENT  
ParticipantMove_SID  BigInt  PK 
Participant_SID   BigInt  FK 
MoveType_SID   BigInt  FK 
MoveReason    Varchar(255)  
is_Ops     Bit 
Order     Integer 

T_LEG  
Leg_SID    BigInt  PK 
StartRegion_SID  BigInt  FK 
EndRegion_SID  BigInt  FK 
PlannedStartDate Datetime  
PlannedEndDate  Datetime  


TJ_PMOV_LEG 
Leg_PMov_SID   BigInt PK 
Leg_SID    BigInt FK 
ParticipantMove_SID BigInt FK 
Order    Integer 

小解说:一位参与者,里面还举的顺序多ParticipantMovements。

腿来自交通运输什么将做不同的腿,从飞机从布鲁塞尔飞往巴黎(腿1),然后巴黎到纽约 (腿2)和从纽约回布鲁塞尔(腿3) 。

我们可以让参与者步入每个起点并走出每个终点。
示例:参加者1驾驶第1代(第1代)和第2代(第2代)。
另一个将飞腿2(1号)和3号线(2号)。
除了对每个参与者都有正确的顺序之外,大多数逻辑是将订单放入joinTable中。

我不必在Java中看到订单,但我需要保持它的正确性,并以正确的顺序检索列表。

这是唯一的解决方案还是我可以有一个正确的顺序列表(以及我如何坚持正确)? :

ParticipantMove:

@OneToMany @JoinTable(name="TJ_PMOV_LEG") 
@MapKeyColumn(name"order") 
private Map<Integer,Leg> getLegs() 

腿:

@OneToMany @JoinTable(name="TJ_PMOV_LEG") 
@MapKeyColumn(name"order") 
private Map<Integer,ParticipantMove> getMoves() 
+0

我认为插入顺序与Java中的集合顺序相同,但我不确定这一点。 – Antoniossss 2014-09-26 08:52:30

回答

4

可以使用@OrderColumn指数。它将会保留在你的连接表中,与它在ArrayList或其他列表中的索引相同。它将保持订单的形式。

@OneToMany 
@JoinTable(name="TJ_PMOV_LEG") 
@OrderColumn(name="order_idx") 
private List<Leg> getLegs() 

此外,您还可以使用@OrderBy批注通过某一列对您的集合进行排序。即

@OneToMany 
@JoinTable(name="TJ_PMOV_LEG") 
@OrderBy(value="lower(Order) asc") //"Order" is column name form T_PARTICIPANT_MOVEMENT table 
private List<ParticipantMove> getMoves() 

最后一个将附加order by子句到你的sql查询。

希望它有帮助。

+0

我会在星期一进行测试,但也在考虑这个方向。如果正确,接受和投票将在星期一进行。 – chillworld 2014-09-26 16:46:12