我正在使用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");
}
答案 0 :(得分:0)
阅读:
如果您担心,可以更改提取策略。
根据JPA规范,@OneToOne
的默认提取类型为EAGER
。
通过设置fetch = FetchType.LAZY
而不是真正的PersonalDetails
对象,返回表示为代理的子类的对象。因此,从employee
表中选择仅在调用getEmployee
后开始。
写信:
您需要在模型中指定实体之间的连接,唯一的方法是employee
字段。但是,您可以指定mappedBy
,请参阅此问题的答案: