代码之家  ›  专栏  ›  技术社区  ›  devuser

具有相同标识符值的不同对象已与会话关联

  •  2
  • devuser  · 技术社区  · 8 年前

    我正在尝试保存用户连接的实体(架次)。 当所有用户都连接起来时,我如何保持实体Sortie。 这是我的代码:

    模型 出击

    @Entity
    public class Sortie implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private Date dateSortie;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_utilisateur", nullable = false)
    private Utilisateur utilisateur;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_recepteur", nullable = false)
    private Utilisateur recepteur;
    
    .... }
    

    public abstract class AbstractDao<PK extends Serializable, T> {
    
    private final Class<T> persistentClass;
    
    @SuppressWarnings("unchecked")
    public AbstractDao() {
        this.persistentClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass())
                .getActualTypeArguments()[1];
    }
    
    @Autowired
    private SessionFactory sessionFactory;
    
    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }
    
    @SuppressWarnings("unchecked")
    public T getByKey(PK key) {
        return (T) getSession().get(persistentClass, key);
    }
    
    public void persist(T entity) {
        getSession().persist(entity);
    
    }
    
    public void merge(T entity) {
        getSession().merge(entity);
    
    
    }
    
    public void update(final T entity) {
        Preconditions.checkNotNull(entity);
        getSession().update(entity);
    }
    
    public void updateorsave(final T entity) {
        Preconditions.checkNotNull(entity);
        getSession().saveOrUpdate(entity);
    }
    
    public void delete(T entity) {
        getSession().delete(entity);
    }
    
    protected Criteria createEntityCriteria() {
        return getSession().createCriteria(persistentClass);
    }
    

    }

    SortieDaoImp公司:

     ....
      public Sortie addSortie(Sortie sortie) {
        merge(sortie);
        return sortie;
    }
    .....
    

    控制器

     ......
     Sortie sortie = new Sortie();
     sortie.setUtilisateur(userService.findUserByUsername(getPseudoCo()));
     sortie.setRecepteur(commande.getUtilisateur());
     Sortie exit = sortieService.addSortie(sortie);
     ......
    

    [编辑]:我无法清除会话,因为我仍然需要目标出击。

    1 回复  |  直到 8 年前
        1
  •  1
  •   devuser    8 年前

    我终于找到了解决办法。所以我不得不在DAoImplementation上使用persistent,如下所示:

    ....
    public Sortie addSortie(Sortie sortie) {
    persist(sortie);
    return sortie;
    }
    .....
    

    并创建一个更新方法,通过影响用户来更新架次。

    @Override
    public void updateSortieRecepteur(Sortie sortie, Utilisateur recepteur) {
        sortie.setRecepteur(recepteur);
        update(sortie);
    } 
    

    最后,我修改了控制器:

     ......
     Sortie sortie = new Sortie();
     sortie.setUtilisateur(userService.findUserByUsername(getPseudoCo()));
     sortie.setRecepteur(commande.getUtilisateur());
     Sortie exit = sortieService.addSortie(sortie);
     sortieService.updateSortieRecepteur(exit, commande.getUtilisateur());
     ......