Hibernate JPA one-to-one de sauver des enfants de la classe de l'entité
J'ai un one-to-one relation à l'aide de PrimaryKeyJoinColumn
annoté sur le parent côté. Et maintenant, je veux sauver l'enfant de l'entité en elle-même.
Par exemple, j'ai Employee
et EmpInfo
que l'entité enfant, j'ai besoin d'enregistrer EmpInfo
(bien sûr après la définition de la propriété id du parent). Toutefois, lorsqu'un tel dispositif est utilisé, j'obtiens une exception énumérés ci-dessous...
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
Des idées pourquoi hibernate ne pas l'autoriser? 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 j'essaie de le sauver...
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);
Tous les pointeurs serait bien apprécié, comme comment puis-je essayer de sauver l'enfant entité?
OriginalL'auteur PaiS | 2010-08-16
Vous devez vous connecter pour publier un commentaire.
Le problème ici est que la
@Id
deEmployeeInfo
est déclaré comme étant générés automatiquement, et vous êtes donc pas censé régler manuellement (Hibernate regarde l'Entité passée àpersist
et suppose qu'il est déjà dans la base de données car le@Id
champ est renseigné).En d'autres termes, supprimer la
@GeneratedValue
surEmployeeInfo
si vous souhaitez définir le PK manuellement.Noter que Hibernate fournit le support pour les
OneToOne
association partage de clé primaire dans la JPA 1.0 par une extension personnalisée. Voir:En JPA 2.0, dérivé identifiants sont bien pris en charge et vous pouvez annoter
OneToOne
etManyToOne
associations avec@Id
. Voir:OriginalL'auteur Pascal Thivent