如何使用鉴别器将一对多集合与连接表映射

发布于 2024-11-16 19:45:26 字数 1045 浏览 0 评论 0原文

我正在尝试用 hibernate 实现一个基本的标记系统。问题是每个人都对 Tag 进行子类化以使映射更容易。我想让我的 Tag 对象不知道它的使用方式。它永远不应该特定于某种类型。然而,事实证明绘制地图非常困难。这就是我想要实现的目标。

我从标签和前缀两个类开始。前缀将包含标签的集合。我有3张桌子。 prefix、tags 和 tagged 其中 tagged 是连接前缀和标签的表。该枚举列出了我将标记的其他对象。这就是我想要支持不同类型的方式。

它看起来像这样:

CREATE TABLE tagged(
tag_id INT(11) NOT NULL,
object_id INT(11) NOT NULL,
discriminator ENUM('PREFIX', 'ROOT', 'SUFFIX') 
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

在映射的核心,我有一个一对多映射

@OneToMany
@JoinTable(name = "tagged", joinColumns = { @JoinColumn(name = "object_id") }, inverseJoinColumns = @JoinColumn(name = "id"))
public List<Tag> getTags() {
    return tags;
}

因此,问题是,如何加入鉴别器表并为其设置值? 我最初尝试过:

@OneToMany
@JoinTable(name = "tagged", joinColumns = @JoinColumn(name = "object_id"), inverseJoinColumns = @JoinColumn(name = "id"))
@Where(clause = "discriminator='PREFIX'")
public List<Tag> getTags() {
    return tags;
}

这不起作用。 Hibernate 正在标签表中查找鉴别器。有什么想法吗?谢谢!

I'm trying to implement a basic tagging system with hibernate. The problem is that everyone has been subclassing Tag to make the mapping easier. I want to keep my Tag object agnostic to how it's used. It should never be specific to a type. However, the mapping has proven to be very difficult. Here is what I am trying to accomplish.

I am starting out with two classes Tag and Prefix. Prefix will contain a collection of tags. I have 3 tables. prefix, tags and tagged where tagged is a table joining prefix and tags. The enumeration lists the other objects that I will tag. This is how I want to support different types.

It looks like this:

CREATE TABLE tagged(
tag_id INT(11) NOT NULL,
object_id INT(11) NOT NULL,
discriminator ENUM('PREFIX', 'ROOT', 'SUFFIX') 
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

At the heart of my mapping I have a one-to-many mapping

@OneToMany
@JoinTable(name = "tagged", joinColumns = { @JoinColumn(name = "object_id") }, inverseJoinColumns = @JoinColumn(name = "id"))
public List<Tag> getTags() {
    return tags;
}

So, the question is, how do I join to the discriminator table and set a value for it?
I initially tried:

@OneToMany
@JoinTable(name = "tagged", joinColumns = @JoinColumn(name = "object_id"), inverseJoinColumns = @JoinColumn(name = "id"))
@Where(clause = "discriminator='PREFIX'")
public List<Tag> getTags() {
    return tags;
}

This didn't work. Hibernate was looking in the tags table for the discriminator. Any ideas? Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怪我闹别瞎闹 2024-11-23 19:45:27

您是否尝试过使用 WhereJoinTable 注释 ?鉴于它的文档,它应该做你想做的事。

Have you tried using the WhereJoinTable annotation? Given its documentation, it should do what you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文