2017-08-01 109 views
3

我正在使用Spring MVC + Hibernate(Spring data jpa)。加入两张表休眠

在这里我没有得到如何在以下情况下在Hibernate中创建表。

我有两个表:

1)用户详情

2)

现在,对于每一个用户,存在一种用于分支的字段,并且该值应该从分支表

我知道OneToOne在休眠。但它会在分支表中为用户分支字段插入一个新条目。我想要的是,当我在用户表中保存用户详细信息时,分支详细信息应该只是来自分支表的参考,用于匹配行。

预先感谢您

+0

你应该检索从DB分支对象并将其设置为UserDetails。如果你这样做,它不应该在分支表中创建一个新行,它应该只是创建引用。 – kimy82

+0

请显示您的代码。你有什么尝试过自己... – KayV

回答

2

假设你的分支机构可以通过它们的名称来标识:

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> { 
    ... 
} 
1

您可以通过控制协会使用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) 
); 
1

步骤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和映射到冬眠作为表

@Entity 
@Table(name = "v_BRANCH_USER") 

public class VBranchUser 
     String userId; 
     .... 
} 

步骤3:可以查询它作为一个表(标准,HQL ..)