【问题标题】:How to do this hibernate mapping?如何做这个休眠映射?
【发布时间】:2011-11-29 18:07:58
【问题描述】:

我是hibernate世界的新手,在以下情况下编写映射文件有点困惑。

我有以下类,我想使用 hibernate 坚持:

class Project {
    int projectID;
    List<String> clients;
    List<String> employers;

    List<String> technologies;
    String description;
}

我已经在数据库中手动创建了以下表格:

+---------------------------+
           project
+---------------------------+

 project_id (pk) | description
+---------------------------+

+---------------------------+    
          organizations
+---------------------------+
  org_id(pk)      | org_name
+---------------------------+

要链接organizationproject 表,我有以下表:

+-------------------------------------------------------------+
                      project_clients
+-------------------------------------------------------------+
  project_id(fk of projects)  | client_id(fk of organizations)
+-------------------------------------------------------------+

+-------------------------------------------------------------+
                     project_employers
+-------------------------------------------------------------+
  project_id(fk of projects) | employer_id(fk of organizations)
+-------------------------------------------------------------+

我不知道如何将这些表映射到我的project 类?知道它是如何完成的吗?

我试图利用列表,但列表持久性我们不能使用链接表(project_clientsproject_employers),我不想为客户列表和雇主列表创建单独的类。还是它是唯一的选择?

请帮忙!


编辑 1 谢谢大家的回答。我还有一个疑问。如何告诉hibernate对于客户(例如'foo company')它应该在组织表中搜索'foo company',如果存在该名称,则获取其相应的ID并将其放入project_clients表中。如果 'organizations' 表中不存在 'foo company',则添加它,然后获取其对应的 ID。我也想为雇主做同样的事情。在hibernate中可以做这件事吗?

目前我已经用java编写了程序来完成这一切。


【问题讨论】:

    标签: hibernate orm mapping hibernate-mapping


    【解决方案1】:

    我认为以下映射将解决您的问题

      @Entity
      @Table(name="project")
      class Project {
    
        @Id
        @GeneratedValue
        int projectID;
        String description;
        //for joing the tables (many-to-many)
        @ManyToMany(cascade=CascadeType.ALL)
        @JoinTable(name = "project_clients",
        joinColumns = {
                   @JoinColumn(name="projectId") 
                 },
        inverseJoinColumns = {@JoinColumn(name="clientId")})
    
        private Set<Organization> clients;
    
       public Set<Organization> getClients(){ 
            return clients; 
       }
       public void setClients(Set<Organization> clients){ 
            this.clients= clients; 
       }
    
       //same for employers
    
       @ManyToMany(cascade=CascadeType.ALL)
       @JoinTable(name = "project_employers",
       joinColumns = {
                   @JoinColumn(name="projectId") 
                 },
       inverseJoinColumns = {@JoinColumn(name="employerId")})
    
       private Set<Organization> employers;
    
       public Set<Organization> getEmployers(){ 
            return employers; 
       }
       public void setEmployers(Set<Organization> employers){ 
            this.employers= employers; 
       }
    
    }
    

    【讨论】:

    • 您好,感谢您的回答。我有一个查询。如何告诉hibernate对于客户(例如'foo company')它应该在组织表中搜索'foo company',如果存在该名称,则获取其相应的ID并将其放入project_clients表中。如果“组织”表中不存在“foo company”,则添加它,然后获取其对应的 ID。我也想为雇主做同样的事情。是否有可能在休眠中做这件事?
    【解决方案2】:

    如果您正在寻找一种直接的方式来实现您想要的:

    import javax.persistence.ElementCollection;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    class Project {
        @Id
        @GeneratedValue
        int projectID;
        @ElementCollection
        List<String> clients;
        @ElementCollection
        List<String> employers;
        @ElementCollection
        List<String> technologies;
        String description;
    }
    

    注意@CollectionsOfElements 已被弃用,因此您最好使用@ElementCollection

    让我知道它是否适合你!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2011-06-11
      相关资源
      最近更新 更多