当我在类中更改Object的字段时,Spring / Hibernate会自动更新数据库

时间:2015-01-07 09:50:57

标签: java spring hibernate spring-mvc hibernate-mapping

我有一个名为VoceMenuUtente的类,注释为@Entity,有2个字段:

  1. Descrizione
  2. TITOLO
  3. 我选择了获取数据库中的数据。在将它们打印到屏幕上之前,我必须在数据库中添加一个字符串,所以我这样做:

    voceMenuUtente.setDescrizione = voceMenuUtente.getDescrizione + "blablabla";
    

    我在一个名为TransactionPreDAO的课程中做到了这一点。我有一个关于该课程的切入点:

    <tx:advice id="txAdviceTransactionPreDAO" transaction-manager="transactionManager" >
                <tx:attributes>
                    <tx:method name="*"/>
                </tx:attributes>
            </tx:advice>    
            <aop:config>
                <aop:pointcut id="transactionPreDAOTxPointcut" expression="execution(* com.springgestioneerrori.preDAO.TransactionPreDAO.*(..))" />
                <aop:advisor advice-ref="txAdviceTransactionPreDAO" pointcut-ref="transactionPreDAOTxPointcut" />
            </aop:config>
    

    在此之后,我的数据库会自动更新,并且在 Descrizione 字段中我没有原始值,但我有原始值加上“blablabla”?

    为什么会这样?我没有对象VoceMenuUtente的任何“更新”方法。也许这取决于切入点。我还在学习Spring,所以我可能犯了一些错误。

    是否取决于我在标记read-only="true"

    中遗漏了<tx:method name="*"/>这一事实

1 个答案:

答案 0 :(得分:4)

通过get,查询,条件等从数据库加载对象后,对象状态与持久性上下文相关联,对它的任何更改都会自动传播到DB。

您不必在该对象上显式调用updateupdate用于通过会话重新附加分离的对象。一个之前一直存在但尚未与Hibernate会话相关联的对象。

如果要覆盖该默认行为,可以调用session.evict(voceMenuUtente)。这将使对象分离(从持久化上下文中逐出对象)。