2011-03-24 58 views
0

我試圖將數據訪問層的一部分轉換爲休眠狀態,並且遇到了一些麻煩,從而無法獲取收集關聯權。我正在使用hibernate註釋,並且有兩個相關的實體(這裏的基本配置正在工作,而不是連接)。有些名字已經模糊:使用舊版映射表的休眠註釋

春季3,休眠3,Java 6中,MySQL的5

集裝箱具有視頻列表。這兩個類都使用註釋映射到休眠狀態。

不幸的是,映射表有一個不尋常的模式。它看起來像這樣:

container_mapping: 
+-----------------+------------------+------+-----+-------------------+-------+ 
| Field   | Type    | Null | Key | Default   | Extra | 
+-----------------+------------------+------+-----+-------------------+-------+ 
| internal_id  | int(10) unsigned | NO | PRI |     |  | 
| external_id  | varchar(255)  | NO | PRI |     |  | 
| mapping_type_id | int(4) unsigned | NO | PRI |     |  | 
| creation_date | timestamp  | NO |  | CURRENT_TIMESTAMP |  | 
+-----------------+------------------+------+-----+-------------------+-------+ 

INTERNAL_ID映射到container.id和EXTERNAL_ID映射到video.id當mapping_type_id = 2

的ID給拉了回來查詢:

select * from container c, container_mapping cm, video v where cm.mapping_type_id=2 and c.episode_id = cm.internal_id and cm.external_id = v.id and c.episode_id=?; 

我可以似乎沒有找到一個很好的例子來讓一個集合與一個具有特定值的連接字段連接。此時我正在抓秸稈。在(不完全)的版本是在這裏:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
@JoinTable(name="container_mapping", 
     joinColumns = @JoinColumn(name="external_id")) 
private List<Video> videos = Lists.newArrayList(); 

人對如何進行任何指針?

回答

3

你可以嘗試映射視頻採集是這樣的:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
@JoinTable(name="container_mapping", 
    joinColumns = @JoinColumn(name="internal_id"), 
    inverseJoinColumns = @JoinColumn(name="external_id") 
@WhereJoinTable(clause="mapping_type_id=2") 
private List<Video> videos = Lists.newArrayList(); 

這背後映射的想法是以下幾點:

  1. 的@JoinTable註釋的joinColumns參數用於配置之列,它存儲容器ID的值。
  2. 存儲視頻ID的列通過使用@JoinTable批註的inverseJoinColumns參數進行配置。
  3. @WhereJoinTable批註可用於限制從連接表中選擇的行。子句參數必須使用SQL編寫。在這種情況下,它用於限制mapping_type_id的值,該值必須是2.
+0

Ahhhh,我以前沒有看到@WhereJoinTable註釋。真棒!我早些時候有了InverseJoinColumn,但是我把它拿出來,因爲它感覺我正在抓着吸管。我給了這一槍。 – liam 2011-03-24 21:12:32