Hibernate的findById方法会导致更新吗?

3

我在使用Spring 3和Hibernate-core 3.5.1-Final的网站应用程序中遇到了一个非常奇怪的行为。

为了简化,我提供了我的代码:

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

请同时提供您的类的映射。 - Luiggi Mendoza
请检查我的编辑-1,非常感谢。 - joksy82
1个回答

1
如果您查询一个实体并更改它,那么默认行为是通过对数据库的更新来保存这些更改。通常情况下,这正是您想要发生的,但显然并非所有情况都是如此。如果您想避免更新,您需要调用session.evict(apDaRip)来分离实体,其中session是对Hibernate会话的引用(请参见Session.evict())。您可能希望在获取实体后立即对其进行分离(在调用findById之后立即进行evict)。

谢谢回复,但是如果我将最后两行移到 if 语句的上面,就不会出现延迟。所以我可能同意分离的方法,但这种行为中还有一些更加难以理解的东西。 - joksy82

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接