2016-10-01 163 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()); 
...... 
相關問題