【问题标题】:Hibernate Annotations with a legacy mapping table带有旧映射表的休眠注释
【发布时间】:2011-07-22 10:37:11
【问题描述】:

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

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

容器有一个视频列表。这两个类都在 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();

有人对如何进行有任何指示吗?

【问题讨论】:

    标签: java mysql hibernate join


    【解决方案1】:

    您可以尝试以这种方式映射视频集合:

    @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。

    【讨论】:

    • 啊啊啊,我以前没见过@WhereJoinTable 注释。惊人的!我之前有 InverseJoinColumn,但我把它拿出来了,因为感觉就像我在抓稻草。我会试一试。
    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2023-03-24
    相关资源
    最近更新 更多