我正在尝试使用 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>
但是,您根本不需要 CategoryDescription
类(因为它只是包装了一个 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/