【问题标题】:Joining two tables Hibernate加入两个表休眠
【发布时间】:2017-08-02 00:15:22
【问题描述】:

我正在使用 Spring MVC + Hibernate (Spring data jpa)。

这里我不知道如何在 Hibernate 中为以下场景创建表。

我有两张桌子:

1) 用户详情

2) 分支

现在,对于每个用户,branch 都有一个字段,该值应该来自 Branch table

我了解休眠中的OneToOne。但它会在 Branch 表中为用户分支字段插入一个新条目。我想要的是,当我将用户详细信息保存在 User 表中时,分支详细信息应该只是分支表中匹配行的引用。

提前谢谢你

【问题讨论】:

  • 您应该从 DB 中检索 Branch 对象并将其设置为 UserDetails。如果你这样做,它不应该在 Branch 表中创建一个新行,它应该只创建引用。
  • 请出示您的代码。你自己试过什么...

标签: java hibernate spring-mvc


【解决方案1】:

假设您的分支可以通过它们的名称来识别:

UserDetails user = new UserDetails();
...
user.setBranch(branchRepository.findOneByName());
...
userDetailsRepository.save(user);

拥有:

@Entity
public class UserDetails {
  @Id
  @GeneratedValue
  Long id;

  @ManyToOne
  Branch branch;
  ...
}

@Entity
public class Branch {
  @Id
  @GeneratedValue
  Long id;
  ...
}

public interface BranchRepository extends Repository<Branch, Long> {
  ...
}

public interface UserDetailsRepository extends Repository<UserDetails, Long> { 
  ...
}

【讨论】:

    【解决方案2】:

    您可以通过外键控制关联来使用用户-分支关系。

    在 User 类中,您将指定 OneToOne 映射,如下所示:

    @OneToOne
    @JoinColumn(name="User_Branch_ID")
    private Branch branch;
    

    而这个“User_Branch_ID”指的是您在创建用户数据库表时创建的外键,如下所示:

    create table BRANCH (
    
       branch_id BIGINT NOT NULL AUTO_INCREMENT,
       name VARCHAR(30) NOT NULL,
       city  VARCHAR(30) NOT NULL,
       country  VARCHAR(30) NOT NULL,
       PRIMARY KEY (address_id)
    );
     
    create table USER (
       user_id BIGINT NOT NULL AUTO_INCREMENT,
       user_branch_id BIGINT NOT NULL,
       first_name VARCHAR(30) NOT NULL,
       last_name  VARCHAR(30) NOT NULL,
       PRIMARY KEY (user_id),
       CONSTRAINT user_branch FOREIGN KEY (user_branch_id) REFERENCES BRANCH ( branch_id)
    );
    

    【讨论】:

      【解决方案3】:

      第 1 步:创建视图

      create view v_BRANCH_USER as 
               select 
                      a.branch_id, a.name ,  a.city, a.country
                      b.user_id,b.first_name, b.last_name
               from BRANCH a,  USER b
               where a.branch_id = b.user_branch_id
      

      第 2 步:创建一个 pojo 并将其映射到 hibernate 作为一个表

      @Entity
      @Table(name = "v_BRANCH_USER")
      
      public class VBranchUser
             String userId;
             ....  
      }
      

      第 3 步:您可以将其作为表格进行查询(Criteria、HQL ..)

      【讨论】:

        猜你喜欢
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        相关资源
        最近更新 更多