2011-03-24 57 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