Spring + hibernate一对一映射

时间:2017-02-14 07:46:25

标签: spring hibernate spring-mvc

我正在使用spring和hibernate开发Web应用程序。我在两个表employee和PersonelDetails之间使用一对一映射。

下面的

是我的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 class ====================

@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

在我的应用程序表中,员工在创建新员工时由管理员用户填写,然后通过登录到他的帐户来管理个人详细信息表(由管理员处理)

现在,当我尝试将个人详细信息bean发送到hibernate层时,我必须从employee表中获取employee bean,然后在personalDetails类上调用setEmployee方法,并将employee bean保存在personalDetails中并发送到hibernate层以保存在数据库中。 / p>

因此,从数据库获取employee 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");

    }

1 个答案:

答案 0 :(得分:0)

阅读:

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

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

写信:

您需要在模型中指定实体之间的连接,唯一的方法是employee字段。但是,您可以指定mappedBy,请参阅此问题的答案:

Java: Hibernate @OneToOne mapping