【问题标题】:Unable to generate tables using hibernate无法使用休眠生成表
【发布时间】:2011-11-01 09:12:21
【问题描述】:

我正在尝试使用休眠生成一些表。我有以下课程:

class Candidate {
    long candidateID;
    String candidate_name;
    List<Project> projects;
}

class Project {
    long projectID;
    Set<String> technologies;
}

我想生成如下表:

+------------------------------+
      candidates
------------------------------|
candidate_id | candidate_name  
+------------------------------+

+------------------------------+
      projects 
------------------------------|
candidate_id | project_id  
+------------------------------+

+----------------------------------------+
      project_technologies 
-----------------------------------------|
candidate_id | project_id | technology_id  
+----------------------------------------+

+------------------------------+
      technologies 
-------------------------------|
technology_id | technology_name  
+------------------------------+

目前Project类的映射文件如下:

<hibernate-mapping package="com.shekhar.tmpProject.model">
    <class name="Project" table="PROJECTS">
        <id name="projectID" column="PROJECT_ID" type="integer"
            unsaved-value="0">
            <generator class="native" />
        </id>
        <set name="technologies" table="PROJECT_TECHNOLOGIES">
            <key column="PROJECT_ID" />
            <element column="TECHNOLOGY_NAME" type="string" />
        </set>
        </class>
</hibernate_mapping>

但目前休眠并没有按照我想要的方式生成表格。我现在得到的是如下内容:

mysql> desc project_technologies;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| PROJECT_ID | int(11)      | NO   | PRI | NULL    |       |
| TECHNOLOGY | varchar(255) | NO   | PRI | NULL    |       |
+------------+--------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

mysql> desc projects;
+--------------+------------+------+-----+---------+----------------+
| Field        | Type       | Null | Key | Default | Extra          |
+--------------+------------+------+-----+---------+----------------+
| PROJECT_ID   | int(11)    | NO   | PRI | NULL    | auto_increment |
| CANDIDATE_ID | bigint(20) | YES  | MUL | NULL    |                |
+--------------+------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> desc candidates;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| CANDIDATE_ID   | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| CANDIDATE_NAME | varchar(255) | NO   |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

谁能帮帮我?

【问题讨论】:

  • 为什么要在 project_technologies 中使用 candidate_id?我认为project_id 将是八分之二

标签: java hibernate hibernate-mapping


【解决方案1】:

如果您想控制其布局,则必须设计一个 Technology 实体。

class Technology {
   long technologyId;
   String technologyName;
}

在您的项目映射中,您必须使用 &lt;many-to-many&gt; 映射而不是 &lt;element&gt;

编辑

如果您使用休眠,您将始终必须为唯一实体创建具体类。有关进一步的继承映射,请参阅以下文档,这是另一种方式。 (多个实体 - 一个或多个表)

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html

另一个机会是将&lt;class&gt; 中的abstract 属性与&lt;union-subclass&gt; 结合使用,此处详细说明:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-unionsubclass

【讨论】:

  • 与技术类似,我还有其他领域也具有相同的结构。例如,我有一个客户和雇主列表,它们基本上是组织名称。那么,如果我必须为“技术”创建新课程,那是否意味着我也必须为雇主和客户创建新课程?
  • 是的,当然。但是你总是有机会使用继承和抽象来 DRY(不要重复自己)
  • 如何使用继承来实现?实际上,我想避免为技术、客户、雇主创建单独的类,因为它们只是字符串,我想避免数据重复。
  • 确实必须编写自己的类...编写一个带有 id 和 name 列的 AbstractNameableEntity 并让 TechnologyOrganisation 等扩展它。有关映射的详细信息,请参阅我即将发布的 EDIT
  • 或者,您可以使用&lt;element&gt; 来处理简单的字符串,但是您将无法获得新实体的 id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多