带有遗留映射表的Hibernate Annotations

时间:2011-03-24 20:01:38

标签: java mysql hibernate join

我正在尝试将数据访问层的一部分转换为hibernate,并且在使集合关联正确时遇到一些麻烦。我正在使用hibernate注释,并且有两个相关的实体(这里的基本配置正在工作,而不是连接)。有些名字被混淆了:

Spring 3,Hibernate 3,Java 6,MySQL 5。

Container有一个视频列表。这两个类都使用注释在hibernate中映射。

不幸的是,映射表有一个不寻常的架构。它看起来像这样:

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 |       |
+-----------------+------------------+------+-----+-------------------+-------+
当mapping_type_id = 2时,

internal_id映射到container.id,external_id映射到video.id

通过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();

任何人都有关于如何进行的任何指示?

1 个答案:

答案 0 :(得分: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. 使用@JoinTable注释的inverseJoinColumns参数配置存储视频ID的列。
  3. @WhereJoinTable注释可用于限制从连接表中选择的行。必须使用SQL编写子句参数。在这种情况下,它用于限制mapping_type_id的值,该值必须为2.