Hibernate JPA واحد إلى واحد إنقاذ كيان طبقة الطفل
-
28-09-2019 - |
سؤال
لدي علاقة فردية باستخدام PrimaryKeyJoinColumn
مشروح على الجانب الوالد. والآن أريد إنقاذ كيان الطفل بنفسه.
على سبيل المثال ، لدي Employee
و EmpInfo
ككيان الطفل ، أحتاج إلى حفظ EmpInfo
(بالطبع بعد تعيين خاصية المعرف للوالد إليها). ومع ذلك ، عند استخدام مثل هذا الترتيب ، أحصل على استثناء مدرج أدناه ...
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
أي أفكار لماذا السبات لا تسمح بذلك؟ لكي أكون أكثر وضوحًا ، فإن الكود لدي أدناه ...
الوالدين:
public class Employee {
private Long id;
private String name;
private EmployeeInfo info;
private Integer enumId;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId() {
return id;
}
@Column(name="EMP_NAME")
public String getName() {
return name;
}
@PrimaryKeyJoinColumn
@OneToOne(cascade = CascadeType.REMOVE)
public EmployeeInfo getInfo() {
return info;
}
}
الطفل:
@Table(name="EMP_INFO")
@Entity
public class EmployeeInfo {
private Long id;
private String email;
@Column(name="EMPLOYEE_EMAIL")
public String getEmail() {
return email;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "emp_id", nullable = false)
public Long getId() {
return id;
}
}
الطريقة التي أحاول حفظها هي ...
Employee emp = new Employee();
emp.setEnumId(SimpleEnum.COMPLETE);
emp.setName("Shreyas");
EmployeeInfo info = new EmployeeInfo();
info.setEmail("Sh@gmail");
concreteDAO.save(emp); // This uses the JPATemplate provided by Spring JpaDaoSupport
info.setId(emp.getId());
concreteDAO.saveEmpInfo(info);
أي مؤشرات ستكون موضع تقدير كبير ، وكيف يمكنني محاولة إنقاذ كيان الطفل؟
المحلول
المشكلة هنا هي أن @Id
من EmployeeInfo
يُعلن أنه تم إنشاؤه تلقائيًا ، وبالتالي ليس من المفترض أن تضعه يدويًا (ينظر السبات إلى الكيان الذي تم تمريره إليه persist
ويفترض أنها موجودة بالفعل في قاعدة البيانات لأن @Id
يتم ملء الحقل).
بمعنى آخر ، أزل @GeneratedValue
على EmployeeInfo
إذا كنت تريد ضبط PK يدويًا.
لاحظ أن السبات يوفر الدعم ل OneToOne
الارتباط باستخدام المفتاح الأساسي المشترك في JPA 1.0 من خلال امتداد مخصص. نرى:
في JPA 2.0 ، يتم دعم المعرفات المشتقة جيدًا ويمكنك التعليق OneToOne
و ManyToOne
الجمعيات مع @Id
. نرى: