我正在使用 Hibernate 4。我有这个带有 Category 和 CategoryItem 表的数据库:
CREATE TABLE `test`.`Category` (
`Id` INT NOT NULL AUTO_INCREMENT ,
`Description` VARCHAR(50) NOT NULL ,
PRIMARY KEY (`Id`) )
CREATE TABLE `test`.`CategoryItem` (
`IdCategory` INT NOT NULL ,
`Id` VARCHAR(10) NOT NULL ,
`Description` VARCHAR(100) NOT NULL ,
PRIMARY KEY (`Id`, `IdCategory`) ,
CONSTRAINT `fk_table1_Category1`
FOREIGN KEY (`IdCategory` )
REFERENCES `test`.`Category` (`Id` ))
这用于存储不同的类别或目录及其值。例如:
类别表:
1, 'Genders'
2, 'Marital status'
3, 'Countries'
类别项目表:
1, 'FEM', 'Female'
1, 'MAL', 'Male'
2, 'SIN', 'Single'
2, 'MAR', 'Married'
3, 'US', 'United States'
3, 'UK', 'England'
这些值在整个架构中使用,但仅对 CategoryItem(Id) 进行逻辑引用,例如:
CREATE TABLE `test`.`Person` (
`Id` INT NOT NULL ,
`Name` VARCHAR(30) NULL ,
--this fields are referencing CategoryItem(Id)
`IdGender` VARCHAR(10) NOT NULL ,
`IdMaritalStatus` VARCHAR(10) NOT NULL ,
`IdCountryOrigen` VARCHAR(10) NOT NULL ,
PRIMARY KEY (`Id`) )
是否可以在 Hibernate 中使用某种技术映射这些表?我现在无法更改此架构。
编辑:
到目前为止,这些是类和映射:
public class Category implements Serializable {
private int id;
private String description;
private Set<CategoryItem> items = new HashSet<CategoryItem>();
public Category() {
}
//getters and setters omitted
}
public class CategoryItem implements Serializable {
private CategoryItemId id;
private Category category;
private String description;
public CategoryItem() {
}
//getters and setters omitted
}
public class CategoryItemId implements Serializable {
private Category category;
private String id;
public CategoryItemId() {
}
//getters and setters omitted
}
public class Person implements Serializable {
private int id;
private String name;
private CategoryItem gender;
private CategoryItem maritalStatus;
private CategoryItem countryOrigen;
public PersonaNatural() {
}
//getters and setters omitted
}
<class catalog="test" name="test.Category" table="Category">
<id name="id" type="int">
<column name="Id"/>
<generator class="increment"/>
</id>
<property name="description" type="string">
<column length="50" name="Description" not-null="true"/>
</property>
<set inverse="true" name="items">
<key>
<column name="IdCategory" not-null="true"/>
</key>
<one-to-many class="test.CategoryItem"/>
</set>
</class>
<class catalog="test" name="test.CategoryItem" table="CategoryItem">
<composite-id class="test.CategoryItemId" name="id">
<key-many-to-one name="category" class="test.Category">
<column name="IdCategory" not-null="true"/>
</key-many-to-one>
<key-property name="id" type="string">
<column name="Id"/>
</key-property>
</composite-id>
<many-to-one name="category" class="test.Category" fetch="select" insert="false" update="false">
<column name="IdCategory" not-null="true"/>
</many-to-one>
<property name="description" type="string">
<column name="Description" length="100" not-null="true"/>
</property>
</class>
<class catalog="test" name="test.Person" table="Person">
<id name="id" type="int">
<column name="Id"/>
<generator class="increment"/>
</id>
<property name="name" type="string">
<column length="30" name="Name" not-null="false"/>
</property>
<many-to-one name="gender" class="test.CategoryItem" fetch="select">
<column name="IdGender" not-null="true"/>
</many-to-one>
<many-to-one name="maritalStatus" class="test.CategoryItem" fetch="select">
<column name="IdMaritalStatus" not-null="true"/>
</many-to-one>
<many-to-one name="countryOrigen" class="test.CategoryItem" fetch="select">
<column name="IdCountryOrigen" not-null="true"/>
</many-to-one>
</class>
我正在尝试多对一,但出现此错误:'must have the same number of columns as the referenced primary key'。这是有道理的,因为我假装只在 Person.hbm.xml 上映射 CategoryId(Id)。
我需要指定where或discriminator值来完成左连接条件,因为 CategoryItem(Id) 本身并不是唯一的。
也许这对于 Hibernate 来说甚至是不可能的,但我将不胜感激。谢谢。