Hibernate:映射 3 个表

标签 hibernate mapping

我正在尝试使用 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)
);

现在我想要一个以 Language 为键,以 Description(表 category_description)为值的 map ,如下所示:

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

任何人都可以就此提供一些建议吗?我已经尝试了“Java Persistence with Hibernate”中第 311/312 页给出的示例,它类似于我的问题,但我只是没有得到它:(

最佳答案

(您的 DDL 不一致,您创建了一个表“language”但引用了一个表“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>

但是,您根本不需要 CategoryDe​​scription 类(因为它只是包装了一个 String):

private Map<Language, String> descriptions;

<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()equals() 才能成功查询生成的 map :

/* 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;
}

关于Hibernate:映射 3 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852371/

相关文章:

java - 如何使用注释在 Hibernate 中表示复合键?

hibernate - gorm/grails排序具有许多子项

javascript - react /JSX : Iterating through an object with key/value pairs

r - 有什么方法可以在 map 上绘制多个条形图?

hibernate - 列出 Hibernate 中使用了哪些设计模式?

java - 用于父/子关系和 DAO/DTO 模式的 Hibernate GenericDAO

tfs - 无法将项目计划发布到 TFS

java - Hibernate 计算属性和 SQL 查询

java - 属性访问异常 : IllegalArgumentException occurred while calling setter

git - 在新的 Vim 窗口中写入 Git 提交消息,然后在 Vim 中提交所有内容