سؤال

لدي علاقة فردية باستخدام 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. نرى:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top