comment utiliser les em.merge() pour insérer OU de mettre à jour pour les entités jpa si la clé primaire est générée par la base de données?

J'ai une entité JPA comme ceci:

@Entity
@Table(name = "category")
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Basic(optional = false)
    @Column(name = "name")
    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "category")
    private Collection<ItemCategory> itemCategoryCollection;

    //...
}

Utiliser Mysql comme base de données. "nom" est conçu comme une clé unique. Utiliser Hibernate comme fournisseur JPA.

Le problème de l'utilisation de méthode de fusion est que parce que pk est généré par la db, donc si l'enregistrement existe déjà (le nom est déjà là) puis Hibernate va essayer de l'insérer dans la base de données et je vais avoir une clé unique contraindre à l'exception de violation et de ne pas faire la mise à jour . Ce que quelqu'un a une bonne pratique pour gérer cela? Merci!!!!

P. S: ma solution est comme ceci:

public void save(Category entity) {

    Category existingEntity = this.find(entity.getName());
    if (existingEntity == null) {
       em.persist(entity);
       //code to commit ...
    } else {
        entity.setId(existingEntity.getId());
        em.merge(entity);
        //code to commit ...
    }
}

public Category find(String categoryName) {
    try {
        return (Category) getEm().createNamedQuery("Category.findByName").
                setParameter("name", categoryName).getSingleResult();
    } catch (NoResultException e) {
        return null;

    }
}

OriginalL'auteur Bobo | 2010-10-22