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?

Était-ce utile?

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:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top