在两列上创建hibernate集合

时间:2009-05-12 02:57:23

标签: hibernate

我正在尝试创建一个地址簿应用程序,其中一个表用于People,另一个用于公司,第三个用于Phones。电话表将包含人员和公司的数据,其中包含一个字段,指示其来源。让我们假设这些是简单的表格:

CREATE TABLE `Person` {
  `id` int(11) NOT NULL auto_increment,
  `firstName` varchar(80) NOT NULL,
  `lastName` varchar(80) NOT NULL
}

CREATE TABLE `Company` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(80) NOT NULL
}

CREATE TABLE `ContactPhone` (
  `id` int(11) NOT NULL auto_increment,
  `contactType` char(1) NOT NULL, -- either 'P' or 'C'
  `contactId` int(11) NOT NULL, -- the id of the Person or Company
  `number` varchar(40) NOT NULL
}

我已经创建了相应的java类,这是一个非常简单的表示形式:

public class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private Collection<Phone> phones;
  // ...
}

public class Company {
  private Integer id;
  private String name;
  private Collection<Phone> phones;
  // ...
}

public class Phone {
  private Integer id;
  private String number;
  // ...
}

在简单的SQL中,我可以非常轻松地获取此人和相应的手机。我需要使用普通的hibernate(没有注释)在Person和Phone之间以及Company和Phone之间创建映射,但是无法使其工作。甚至不确定它是否必须是单向的或双向的。我搜索了文档,但没有找到任何可以提供帮助的内容。任何人吗?

4 个答案:

答案 0 :(得分:1)

最后,我设法让这个工作。我正在寻找的是hibernate的多态元素。我最终创建了一个Contact类,如下所示:

public class Contact {
  private Integer id;
  private Collection<Phone> phones;
  ...
}

并从中派生出人员和公司。使用Hibernate的多态性,可以将Person和Company存储在不同的表中,并使Phone以双向方式连接到Contact。

答案 1 :(得分:0)

您可以使用Hibernate的"Filters" mapping feature来实现此目的

答案 2 :(得分:0)

如果你问如何通过配置文件中的映射表映射它们,它将看起来像这样:

<bag name="Phone" table="CompanyPhoneMapping" lazy="true" cascade="all">

<key column="CompanyId" />

<one-to-many class=<insert namespace>.Phone, <insert dll> />

</bag>

我只熟悉nhibernate,但我认为java hibernate解决方案类似。

答案 3 :(得分:0)

对此进行建模的接受方式是与PersonCompany类中的连接表的单向关联。如何实现这完全取决于您的模型的具体情况。在线文档为here