我在使用spring 3和hibernate-core 3.5.1-Final的web应用程序中遇到了一个非常奇怪的行为。
为简单起见,我提供了我的代码..
if(ripid!=null){ //Parameter
Appuntamento apDaRip = appuntamentoService.findById(ripid);
if(apDaRip.getIdpadre()!=null){
apDaRip.setNota("RIPROGRAMMATO n."+ripid.toString()+"\n"+apDaRip.getNota());
apDaRip.setIdpadre(apDaRip.getIdpadre());
}else{
apDaRip.setNota("RIPROGRAMMATO n."+ripid.toString()+"\n"+apDaRip.getNota());
apDaRip.setIdpadre(ripid);
}
try{
apDaRip.setOrarioinizio(null);
apDaRip.setDurata(null);
//apDaRip.setIdappuntamento(null);
}catch(Exception e){e.printStackTrace();}
map.put("appuntamento", apDaRip);
}
di = datiintranetService.findById(DatiintranetService.PASS_X_INTERVENTI);
map.put("passinterventi", di.getBoolean());
背后的想法是使用对象的一些数据" Appuntamento"用于生产新的。 所以我要改变一些值,然后在将对象发送到我的视图(jsp)之前,我通过调用findbyid来获取其他数据。这会导致更新Appuntamento对象......当然,我不想要这种行为。有人可以解释一下吗?
修改-1
这里是Dao
@Transactional
public class DatiintranetService {
private DatiintranetDAO datiintranetDAO;
public void setDatiintranetDAO(DatiintranetDAO datiintranetDAO) {
this.datiintranetDAO = datiintranetDAO;
}
public DatiintranetDAO getDatiintranetDAO() {
return datiintranetDAO;
}
public Datiintranet findById(Integer id) {
return datiintranetDAO.findById(id);
}
}
对于Appuntamento课程,我提供了一个快照
@Entity
@Table(name = "appuntamento", schema = "public")
public class Appuntamento implements java.io.Serializable {
@Id
@SequenceGenerator(name="appuntamentoID", sequenceName="appuntamento_idappuntamento_seq",allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="appuntamentoID")
@Column(name = "idappuntamento", unique = true, nullable = false)
public Integer getIdappuntamento() {
return this.idappuntamento;
}
}
修改-2 如果我在if语句上方移动两行,则不会发生更新。
di = datiintranetService.findById(DatiintranetService.PASS_X_INTERVENTI);
map.put("passinterventi", di.getBoolean());
答案 0 :(得分:1)
如果查询实体并更改实体,则默认行为是通过对数据库的更新来保留这些更改。这通常是你想要发生的事情,但显然不是在所有情况下。
如果要避免更新,则需要通过调用session.evict(apDaRip)
来分离实体,其中session
是对hibernate会话的引用(请参阅Session.evict()
)。您可能希望在获得实体后立即evict
实体(紧随调用findById
后)。