【问题标题】:a Different object with the same identifier value was already associated with the session具有相同标识符值的不同对象已与会话关联
【发布时间】:2016-10-01 13:28:57
【问题描述】:

我正在尝试将用户连接的实体(Sortie)持久化。 所以我有一个管理员会影响用户的出击,但是当用户连接时我有这个问题意味着当对象已经在会话中时。 在整个用户都连接的情况下,我如何保持实体 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;

.... }

DAO:

抽象道:

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);
 ......

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

【问题讨论】:

    标签: java hibernate persistence dao


    【解决方案1】:

    我终于找到了解决办法。所以我不得不像这样在 DAOImplementation 上使用坚持:

    ....
    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());
     ......
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-16
      • 2013-08-30
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多