Hibernate:映射3个表
我正在尝试用Hibernate映射一些现有的表 这很简单:我们的类别有多种语言的名称 DDL如下所示:Hibernate:映射3个表,hibernate,mapping,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
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>();
private Map descriptions=new HashMap();
有人能给我一些关于这方面的建议吗?我尝试了第311/312页上的“Hibernate下的Java持久化”中的示例,它与我的问题相似,但我不明白:((您的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>
及
您好,非常感谢您的回答。我们以一种我不喜欢的方式解决了这个问题,但我一定会尝试一下。您对DDL不一致性的看法是正确的;我试图“简化”有些东西,但显然遗漏了一些东西。在这方面,CategoryDescription也被简化了,它有更多的属性。对于其他实体,我们也有相同的3表设置(我们的许多实体都有类似设计的多语言描述。我会在有时间尝试您的解决方案后尽快发回。谢谢。
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>
/* 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;
}