Hibernate:映射3个表

2024-03-06

我正在尝试使用 Hibernate 映射一些现有表。

这很简单:我们有具有多种语言名称的类别。

DDL如下:

create table language (
   id                integer not null auto_increment,
   code              varchar(2) not null,

   unique (code),

   primary key(id)
);

create table category (
   id               integer not null auto_increment,
   parent_id        integer default null,
   ordr             integer not null default 99,

   primary key (id)
);

create table category_description (
   category_id      integer not null,
   language_id      integer not null,

   title            varchar(255) not null,

   constraint foreign key (category_id) references category(id),
   constraint foreign key (country_language_id) references country_language(id),

   primary key (category_id, country_language_id)
);

现在我想要一个以语言为键、以描述(表类别_描述)为值的地图,如下所示:

private Map<Language, CategoryDescription> descriptions = new HashMap<Language, CategoryDescription>();

有人可以给我一些关于这方面的指示吗?我已经尝试过“Java Persistence with Hibernate”第 311/312 页上给出的示例,它类似于我的问题,但我只是不明白:(


(您的 DDL 不一致,您创建了一个表“语言”但引用了一个表“country_language”——我假设是后者)

您的示例的 Hibernate 映射如下所示:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="false">

    <class name="Language" table="country_language">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="code" type="string" length="2" unique="true" />
    </class>

    <class name="Category" table="category">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <map name="descriptions" table="category_description">
            <key column="category_id" />
            <map-key-many-to-many column="language_id" class="Language" />
            <composite-element class="CategoryDescription">
                <property name="title" type="string" length="255" />
            </composite-element>
        </map>
    </class>

</hibernate-mapping>

但是,您不需要CategoryDescription根本没有类(因为它只是包装了一个String):

private Map<Language, String> descriptions;

and

<map name="descriptions" table="category_description">
    <key column="category_id" />
    <map-key-many-to-many column="language_id" class="Language" />
    <element type="string" length="255" column="title" />
</map>

也会同样有效。

请注意,在这两种情况下,您的Language类需要重写hashCode() and equals()为了能够成功查询结果地图:

/* eclipse generated */
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    return result;
}

/* eclipse generated */
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Language other = (Language) obj;
    if (id == null) {
        if (other.id != null)
            return false;
    } else if (!id.equals(other.id))
        return false;
    return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate:映射3个表 的相关文章

随机推荐

  • Jetpack compose - 当应用程序返回前台时如何刷新屏幕

    当应用程序返回前台时 我需要自动刷新 Android Compose 屏幕 我有一个需要权限和位置服务的 如果用户关闭了其中任何一项 则会绘制一个需要更改的项目列表 当用户转到 设置 并且应用程序返回前台时 我希望刷新列表以反映更改 我正在
  • Android WebView 硬件加速 Artefact 解决方法

    Android 中的 WebView 硬件加速存在一个已知的错误 例如 请参见此处 https code google com p android issues detail id 17352 https code google com p
  • 每次 React 向 Express 发送请求时,都会生成一个新的会话

    I use React作为客户端发送请求Express with proxy and express session设置 但每次 React 向 Express 服务器发出请求时 都会创建一个新会话 因此 我通过手动访问相同的 api ur
  • chrome.tabs.update() 重定向到 'chrome-extension://invalid/'

    我编写了一个 chrome 扩展 它根据作为内容脚本注入的计时器的值重定向当前选项卡 后台脚本通过每隔一段时间轮询每个计时器来跟踪所有打开的选项卡的运行时间 如果在特定站点上花费的时间超过给定限制 则将活动选项卡重定向到间隙页面 并提供重置
  • 如何使用SBT和IntelliJ IDEA管理多个相互依赖的模块?

    我正在开发几个相互依赖的模块 并且希望在一个 IDEA 项目中将它们一起使用 我在用着sbt idea https github com mpeltonen sbt idea从 sbt 构建定义生成 IDEA 项目 这对于单个项目非常有用
  • 如何阻止 Reporting Services 报表在启动时自动呈现?

    我注意到 如果报表的所有参数都指定了默认值 那么它会在启动时自动呈现 我怎样才能防止这种情况发生 也就是说 我不希望在用户单击 查看报告 按钮之前呈现报告 如果所有参数都有默认值 则无法停止报表呈现 自动停止报表呈现的唯一方法是至少有一个没
  • Mac 命令行 - 列出可用的串行端口?

    在我的 Mac 上 我目前有可用的串行端口 dev tty usbserial A700dYoR dev cu usbserial A700dYoR dev tty 蓝牙 PDA 同步 dev cu 蓝牙 PDA 同步 dev tty 蓝牙
  • Java:在for循环init中初始化多个变量?

    我想要两个不同类型的循环变量 有什么办法可以让这个工作吗 Override public T get int index throws IndexOutOfBoundsException syntax error on first int
  • 放大 AMCharts 时丢失 Timeserie

    当我放大图表时 serie2 消失了 如果我通过从右侧选择光标进行缩放 但是从左侧缩放工作正常 无论如何 我期待看到 2 系列 但似乎有时不是 See my 截屏 https i stack imgur com MXsX1 png 知道为什
  • 在opencv c++中绘制旋转矩形

    我想用c 在opencv中绘制一个旋转的矩形 我用 rectangle 函数如下 rectangle RGBsrc vertices 0 vertices 2 Scalar 0 0 0 CV FILLED 8 0 但是这个函数画了一个0角的
  • 从 C# 安装项目运行另一个程序

    我已经用 C 创建了一个设置和部署项目 现在我有另一个 Windows 更新 exe 我想在安装我的项目之前成功运行和安装它 我已将 exe 与我的项目打包在一起 我之前如何运行该exe 您想要将自定义操作添加到运行可执行文件的安装项目 本
  • 根据等于 x.x.x.x/x 的 IP 字符串计算 IP 范围

    给定 IP 字符串 我如何计算 IP 范围x x x x x最常见的情况可能是198 162 1 1 24但可以是任何东西 任何法律允许的东西 我要拿198 162 1 1 24并将其转换为 198 162 1 1 198 162 1 12
  • 音频 - 快进 30 秒

    我有一个音频播放器 可以播放从 Core Date 检索到的音频 播放和暂停工作正常 我正在尝试实现 向前跳转 30 秒 按钮 并寻求有关如何实现该操作的任何指示 我的 播放 暂停 按钮的代码 IBAction func playPress
  • Python Selenium Webdriver - 动态更改下载目录

    为了在定义 selenium webdriver 之前显式定义下载目录 我们使用以下代码 chromeOptions webdriver ChromeOptions prefs download default directory C da
  • 使用 Mayavi 制作 3D 图表,并使用 Matplotlib 风格的轴

    我一直在用 Mayavi 进行 3D 绘图 我可以绘制我想要的散点图 但似乎无法让轴看起来正确 我发现了以下内容上一个问题 https stackoverflow com questions 4739360 any easy way to
  • JOOQ 嵌套条件

    嗨 我想弄清楚如何在 jooq 中写这样的东西 select from table where a query or b query or a query and e query or g query or z query 我不知道如何在
  • 将相等的矩形拟合成更大的矩形

    我有一个大矩形dimensions L W and n smaller rectangles每个都有相同的尺寸l w 每个小矩形都有相同的dimensions 我的目标是适合所有人n of smaller将矩形合并到大矩形中 同时尽可能最有
  • Rails 5.2 中范围内的连接与 Rails 5.1 有何不同?

    将 Rails 从 5 1 升级到 5 2 后 我开始收到以下错误 NoMethodError undefined method expr for nil NilClass from gems path activerecord 5 2 0
  • 该捆绑包无效。 Apple 目前不接受使用此版本的 SDK 4.2 构建的应用程序 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 亲爱的关心
  • Hibernate:映射3个表

    我正在尝试使用 Hibernate 映射一些现有表 这很简单 我们有具有多种语言名称的类别 DDL如下 create table language id integer not null auto increment code varcha