2016-10-01 114 views
2

我试图坚持实体(Sortie)用户连接的位置。 所以我有一个管理员会影响用户的出勤,但是当用户连接时我有这个issu意味着对象已经在会话中。 如何在整个用户连接时坚持实体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:

AbstarctDao:

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

[编辑]:我不能清除会话,因为我仍然需要obejct出击。

回答

1

我终于找到了解决办法。所以我不得不坚持这样的DAoImplementation:

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

并创建一个更新方法,它将通过影响用户来更新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()); 
...... 
相关问题