Hibernate JPA un à une économie entité classe enfant
-
28-09-2019 - |
Question
I ai one-to-one en utilisant PrimaryKeyJoinColumn
annoté sur le côté parent. Et maintenant, je veux sauver l'entité enfant lui-même.
Par exemple, je Employee
et EmpInfo
comme l'entité enfant, je dois sauver EmpInfo
(bien sûr après avoir défini la propriété id du parent à lui). Cependant, lorsqu'un tel arrangement est utilisé, je reçois une exception ci-dessous ...
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
Toutes les idées pourquoi veille prolongée ne permet pas? Pour être plus clair, le code que j'ai est ci-dessous ...
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;
}
}
La façon dont je tente de le sauver est ...
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);
Les pointeurs seraient appréciés, à comment puis-je essayer de sauver l'entité enfant?
La solution
Le problème ici est que le @Id
de EmployeeInfo
est déclarée comme étant généré automatiquement et vous êtes donc pas censé définir manuellement (Hibernate regarde à l'entité et transmis à persist
suppose qu'il est déjà dans la base de données parce que le @Id
champ est rempli).
En d'autres termes, retirez le @GeneratedValue
sur EmployeeInfo
si vous voulez régler le PK manuellement.
Notez que Hibernate prend en charge l'association OneToOne
à l'aide d'une clé primaire partagée dans JPA 1.0 à une extension personnalisée. Voir:
Dans JPA 2.0, les identifiants dérivés sont bien pris en charge et vous pouvez annoter les associations OneToOne
et ManyToOne
avec @Id
. Voir: