2017-02-14 120 views
-2

我正在开发使用spring和hibernate的web应用程序。我正在使用employee和PersonelDetails两个表之间的一对一映射。下面Spring +休眠一对一映射

是我的bean类

=======================员工============= ========================

@Entity 
@Table(name="employee") 
public class Employee { 
    @Id 
    @Column 
    @GeneratedValue 
    private int empid; 
    @Column 
    private String firstName; 
    @Column 
    private String lastName; 
    @Column 
    private String email; 
    @Column 
    private String password; 
    @Column 
    private boolean isAdmin; 

    @Column 
    private boolean isActive; 

    @Column 
    private boolean isLocked; 
//getter setters 

=================== = personalDetails类====================

@Entity 
@Table(name="PersonalDetails") 
public class PersonalDetails { 
    @Column 
    @Id 
    private int empid; 
    @Column 
    private String personalEmail; 
    @Column 
    private String mob; 
    @Column 
    private String permenantAdress; 
    @Column 
    private String currentAddress; 
    @Column 
    private String gender; 
    @Column 
    private String maritialStatus; 

    @MapsId 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "empid", referencedColumnName = "empid") 
    @ForeignKey(name="empid") 
    private Employee employee; 

//getter setters 

在我的申请表的员工是由管理员用户一段时间后,在创建新员工充满employyee本人填写personalDetails表通过登录到他的账户编辑由管理)

现在,当我尝试发送个人的详细信息bean到休眠层首先我必须从员工表中获取雇员bean,然后调用setEmployee方法在personalDetails类和保存雇员bean在personalDetails并发送到休眠层保存在数据库中。

因此,从数据库获取员工bean并通过personalDetails bean再次发回会导致性能问题。

任何人都可以帮助这里澄清,同时保存数据在子表(PersonalDetails)是否真的强制传递父对象(Employee)?

=======================代码存储personalDetails ===============

@RequestMapping(value="addpersonal") 
    public ModelAndView addPersonalDetails(@ModelAttribute("personalDetails") PersonalDetails personalDetails) { 
     //personalDetails.setEmpid(1); 
     personalDetails.setCurrentAddress("niljyoti"); 
     personalDetails.setMob("9405715872"); 
     personalDetails.setPermenantAdress("address"); 
     Employee e = empService.getEmployeebyUserName(uname); 
     personalDetails.setEmployee(e); 
     personalDetailsService.addPersonalDetails(personalDetails); 
     return new ModelAndView("home"); 

    } 
+2

哪个代码导致其性能问题?发布代码而不是描述它。 –

回答

0

在阅读:

如果您担心,您可以更改提取策略。 根据JPA规范,@OneToOne的默认获取类型为EAGER

通过设置fetch = FetchType.LAZY,而不是真正的PersonalDetails对象,返回一个子类的对象作为代理行为。因此,从employee表中选择仅在调用getEmployee后才开始。

上写:

你需要指定实体之间的连接,在模型中,唯一的办法就是employee场。但是,你可以指定mappedBy,看到这个问题的答案:

Java: Hibernate @OneToOne mapping