【问题标题】:Spring + hibernate one to one mappingSpring + hibernate 一对一映射
【发布时间】:2017-02-14 07:46:24
【问题描述】:

我正在使用 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

====================个人资料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

在我的应用程序表中,员工由管理员用户填写,同时创建新员工之后,该员工本人通过登录到他的帐户填写personalDetails表由管理员创建)

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

因此,从数据库中获取员工 bean 并再次通过个人详细信息 bean 发回会导致性能问题。

在将数据保存在子表(PersonalDetails)中时,任何人都可以在这里帮助澄清一下是否真的必须传递父对象(Employee)?

========================存储个人详情的代码===============

@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");

    }

【问题讨论】:

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

标签: spring hibernate spring-mvc


【解决方案1】:

阅读中:

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

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

写入时:

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

Java: Hibernate @OneToOne mapping

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 2012-04-21
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多