Frage

Ich habe eine Eins-zu-Eins-Beziehung PrimaryKeyJoinColumn auf der übergeordneten Seite annotiert wird. Und jetzt will ich selbst das Kind Entität speichern.

Zum Beispiel, ich habe Employee und EmpInfo als Kind Entität, ich brauche EmpInfo zu retten (natürlich nach der ID-Eigenschaft des Mutter es Einstellung). Wenn jedoch eine solche Anordnung verwendet wird, ich eine Ausnahme erhalten unten aufgeführten ...

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist

Irgendwelche Ideen, warum Hibernate nicht das zulassen? Um mehr klar zu sein, der Code, den ich habe, ist unten ...

ParentEntity:

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;
    }
  }

ChildEntity:

@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;
    }
}

So wie ich versuche, es zu retten ist ...

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

Alle Hinweise wären sehr willkommen, wie kann ich versuchen, das Kind Entität zu speichern?

War es hilfreich?

Lösung

Das Problem hierbei ist, dass die @Id von EmployeeInfo als deklariert wird automatisch generiert wird, und Sie sind so soll es nicht manuell einstellen (Hibernate Blicke auf das Entity weitergegeben persist und nimmt sie ist bereits in der Datenbank, da der @Id Feld wird).

Mit anderen Worten, entfernen Sie die @GeneratedValue auf EmployeeInfo, wenn Sie die PK manuell einstellen möchten.

anzumerken, dass für die Ruhe Unterstützung OneToOne Assoziation stellt einen gemeinsamen Primärschlüssel in JPA 1.0 durch eine benutzerdefinierte Erweiterung verwenden. Siehe auch:

In JPA 2.0, abgeleiteten Kennungen werden gut unterstützt und Sie können OneToOne und ManyToOne Assoziationen mit @Id mit Anmerkungen versehen. Siehe auch:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top