web-dev-qa-db-fra.com

Entité détachée passée à l'erreur persistante

Je reçois cette erreur lors de la soumission du formulaire:

org.hibernate.PersistentObjectException: entité détachée transmise à la persistance: com.project.pmet.model.Account; l'exception imbriquée est javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: entité détachée transmise à la persistance: com.project.pmet.model.Account

Voici mes entités:

Compte: 

@Entity
@DynamicInsert
@DynamicUpdate
public class Account {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String login;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String email;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
    private List<Team> ownedTeams;

    ...

Équipe:

@Entity
@DynamicInsert
@DynamicUpdate
public class Team {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String name;

    @ManyToOne
    @JoinColumn(name = "owner_id", nullable = false)
    private Account owner;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "team")
    private List<Account> members;

    ...

Voici une partie du contrôleur:

    @ModelAttribute("team")
    public Team createTeamObject() {
        return new Team();
    }

    @RequestMapping(value = "/teams/create-team", method = RequestMethod.GET)
    public String getCreateTeam(@ModelAttribute("team") Team team, Principal principal) {
        logger.info("Welcome to the create team page!");

        Account owner = accountService.findOneByLogin(principal.getName());
        team.setOwner(owner);
        team.setMembers(new AutoPopulatingList<Account>(Account.class));

        return "teams";
    }

    @RequestMapping(value = "/teams/create-team", method = RequestMethod.POST)
    public String postCreateTeam(@ModelAttribute("team") Team team) {
        logger.info("Team created!");

        teamService.save(team);

        return "redirect:/teams.html";
    }

Et la forme:

<form:form commandName="team" id="teamForm">
      <div class="form-group">
          <label>Name</label>
          <form:input path="name" cssClass="form-control" />
      </div>
      <div class="form-group" id="row-template">
          <label>Members</label>
          <form:select path="members[0].id" cssClass="form-control" data-live-search="true" >
             <form:options items="${accounts}" itemValue="id" />
          </form:select>
          ...
      </div>
   <form:hidden path="owner.id" />
</form:form>

Qu'est-ce que je fais mal?

12
keysersoze

L'erreur se produit parce que id est défini. Hibernate distingue les objets transitoires des objets détachés et persiste dans les travaux uniquement avec des objets transitoires.

isteamService.save(team);

dans cette opération ne peut pas être chargé id car est @GeneratedValue

11
borchvm

Puisque votre identifiant est une valeur générée automatiquement, ne l'envoyez pas du côté client. J'ai eu le même problème. Assurez-vous que vous ne fournissez pas de valeur pour l'attribut généré automatiquement. 

0
Pubudu