hibernate findbyid导致更新?

时间:2014-11-10 16:35:08

标签: java hibernate spring-mvc

我在使用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());

1 个答案:

答案 0 :(得分:1)

如果查询实体并更改实体,则默认行为是通过对数据库的更新来保留这些更改。这通常是你想要发生的事情,但显然不是在所有情况下。

如果要避免更新,则需要通过调用session.evict(apDaRip)来分离实体,其中session是对hibernate会话的引用(请参阅Session.evict())。您可能希望在获得实体后立即evict实体(紧随调用findById后)。