【问题标题】:Hibernate map several relationship to same tableHibernate 将多个关系映射到同一张表
【发布时间】:2014-01-15 13:47:59
【问题描述】:

我有以下 ER:

我想知道如何使用 hibernate 映射第三个表。 我有这个代码:

@ManyToOne(optional = false)
@JoinColumns({
  @JoinColumn(name = "tbl3_tbl1_id", referencedColumnName = "tbl2_tbl1_id", insertable = false, updatable = false),
  @JoinColumn(name = "tbl3_tbl2_id", referencedColumnName = "tbl2_id", insertable = false, updatable = false)})
public TableDB getTableDB() {
   return tableDB;
}

@OneToOne(optional = false)
@JoinColumns({
  @JoinColumn(name = "tbl3_tbl1_id", referencedColumnName = "tbl2_tbl1_id", insertable = false, updatable = false),
  @JoinColumn(name = "tbl3_tbl2_id_2", referencedColumnName = "tbl2_id", insertable = false, updatable = false)})
public TableDB getTableDB2() {
   return tableDB2;
}

@OneToOne(optional = false)
@JoinColumns({
  @JoinColumn(name = "tbl3_tbl1_id", referencedColumnName = "tbl2_tbl1_id", insertable = false, updatable = false),
  @JoinColumn(name = "tbl3_tbl2_id_3", referencedColumnName = "tbl2_id", insertable = false, updatable = false)})
public TableDB getTableDB3() {
   return tableDB3;
}

问题在于一对一的 2 和 3。 当我调用“保存”方法时,插入代码是这样的:

insert into table3 (tbl3_desc, tbl3_id, tbl3_tbl1_id, tbl3_tbl2_id) values (?, ?, ?, ?)

tbl3_tbl2_id_2, tbl3_tbl2_id_3 列在哪里?

有什么建议或建议吗?

【问题讨论】:

    标签: java spring hibernate oracle11g hibernate-mapping


    【解决方案1】:

    如果我们举一个具体的例子如下:

    table1 的地图--> COMPANIES:

      import java.io.Serializable;
      import java.util.List;
      import javax.persistence.Basic;
      import javax.persistence.CascadeType;
      import javax.persistence.Column;
      import javax.persistence.Entity;
      import javax.persistence.FetchType;
      import javax.persistence.Id;
      import javax.persistence.OneToMany;
      import javax.persistence.Table;
      import javax.validation.constraints.NotNull;
      import javax.validation.constraints.Size;
    
      @Entity
      @Table(name = "COMPANIES")
      public class Company implements Serializable {
         private static final long serialVersionUID = 1L;
         @Id
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 4)
         @Column(name = "COMP_KEY")
         private String key;
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 100)
         @Column(name = "COMP_DESCRIPTION")
         private String description;
         @OneToMany(cascade = CascadeType.ALL, mappedBy = "company", fetch = FetchType.LAZY)
         private List<Branch> branches;
         //GETTERS, SETTERS...
      }
    

    table2的映射-->BRANCHES

      import java.io.Serializable;
      import java.util.List;
      import javax.persistence.Basic;
      import javax.persistence.CascadeType;
      import javax.persistence.Column;
      import javax.persistence.EmbeddedId;
      import javax.persistence.Entity;
      import javax.persistence.FetchType;
      import javax.persistence.JoinColumn;
      import javax.persistence.ManyToOne;
      import javax.persistence.OneToMany;
      import javax.persistence.Table;
      import javax.validation.constraints.NotNull;
      import javax.validation.constraints.Size;
    
      @Entity
      @Table(name = "BRANCHES")
      public class Branch implements Serializable {
         private static final long serialVersionUID = 1L;
         @EmbeddedId
         protected BranchPK branchPK;
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 100)
         @Column(name = "BRAN_DESCRIPTION")
         private String description;
         @JoinColumn(name = "BRAN_COMP_KEY", referencedColumnName = "COMP_KEY")
         @ManyToOne(optional = false, fetch = FetchType.LAZY)
         private Company company;
         @OneToMany(cascade = CascadeType.ALL, mappedBy = "branch", fetch = FetchType.LAZY)
         private List<Employee> staff;
         //GETTERS, SETTERS, ETC
      }
    
      import java.io.Serializable;
      import javax.persistence.Basic;
      import javax.persistence.Column;
      import javax.persistence.Embeddable;
      import javax.validation.constraints.NotNull;
      import javax.validation.constraints.Size;
    
      @Embeddable
      public class BranchPK implements Serializable {
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 4)
         @Column(name = "BRAN_COMP_KEY")
         private String companyKey;
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 4)
         @Column(name = "BRAN_KEY")
         private String brachKey;
         //GETTERS, SETTERS, ETC
      }
    

    table3的地图-->STAFF

      import java.io.Serializable;
      import javax.persistence.Basic;
      import javax.persistence.Column;
      import javax.persistence.EmbeddedId;
      import javax.persistence.Entity;
      import javax.persistence.FetchType;
      import javax.persistence.JoinColumn;
      import javax.persistence.JoinColumns;
      import javax.persistence.ManyToOne;
      import javax.persistence.OneToOne;
      import javax.persistence.Table;
      import javax.validation.constraints.NotNull;
      import javax.validation.constraints.Size;
    
      @Entity
      @Table(name = "STAFF")
      public class Employee implements Serializable {
         private static final long serialVersionUID = 1L;
         @EmbeddedId
         protected EmployeePK employeePK;
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 15)
         @Column(name = "EMPL_NAME")
         private String name;
    
         @JoinColumns({
            @JoinColumn(name = "EMPL_COMP_KEY", referencedColumnName = "BRAN_COMP_KEY", insertable = false, updatable = false),
            @JoinColumn(name = "EMPL_BRAN_KEY", referencedColumnName = "BRAN_KEY", insertable = false, updatable = false)})
         @ManyToOne(optional = false, fetch = FetchType.EAGER)
         private Branch branch;
         @JoinColumns({
            @JoinColumn(name = "EMPL_COMP_KEY", referencedColumnName = "BRAN_COMP_KEY", insertable = false, updatable = false),
            @JoinColumn(name = "EMPL_BRAN_SUPER", referencedColumnName = "BRAN_KEY", insertable = false, updatable = false)})
         @OneToOne(optional = false)
         private Branch branchSupervice;
         @JoinColumns({
            @JoinColumn(name = "EMPL_COMP_KEY", referencedColumnName = "BRAN_COMP_KEY", insertable = false, updatable = false),
            @JoinColumn(name = "EMPL_BRAN_VISIT", referencedColumnName = "BRAN_KEY", insertable = false, updatable = false)})
         @OneToOne
         private Branch branchVisitor;
         //GETTERS, SETTERS, ETC
      }
    
      import java.io.Serializable;
      import javax.persistence.Basic;
      import javax.persistence.Column;
      import javax.persistence.Embeddable;
      import javax.validation.constraints.NotNull;
      import javax.validation.constraints.Size;
    
      @Embeddable
      public class EmployeePK implements Serializable {
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 4)
         @Column(name = "EMPL_COMP_KEY")
         private String companyKey;
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 4)
         @Column(name = "EMPL_BRAN_KEY")
         private String branchKey;
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 4)
         @Column(name = "EMPL_KEY")
         private String employeeKey;
         //GETTERS, SETTERS, ETC
      }
    

    对于这种情况,我有一个“家庭疗法”解决方案。 我为每个关联对象的主键创建了 2 个额外字段。

      @Entity
      @Table(name = "STAFF")
      public class Employee implements Serializable {
         private static final long serialVersionUID = 1L;
         //Besides the above mentioned code
         @Basic(optional = false)
         @NotNull
         @Size(min = 1, max = 4)
         @Column(name = "EMPL_BRAN_SUPER")
         private String keyBranchSupervice;
         @Size(max = 4)
         @Column(name = "EMPL_BRAN_VISIT")
         private String keyBranchVisitor;
    
         public void setBranchSupervice(Branch branchSupervice) {
            this.keyBranchSupervice = branchSupervice.branchPK.getBrachKey();
            this.branchSupervice = branchSupervice;
         }
      }
    

    并为对象的setBranchSupervice上的同一个FK中的每个字段指定,我等于值​​。 有了这个我就可以流畅地添加、编辑、删除了。

    但我仍然有疑问(良好做法)。

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      相关资源
      最近更新 更多