【问题标题】:Hibernate SaveOrUpdate doing nothing休眠 SaveOrUpdate 什么都不做
【发布时间】:2015-07-30 00:00:01
【问题描述】:

我使用 Spring 3.2 和 Hibernate 3.6.7。

我有一个显示实体的表单,提交表单并保存实体。使用 saveOrUpdate 方法。

在我创建实体类 implements FieldHandled 之前它一直有效。 现在 saveOrUpdate() 什么都不做。

我阅读了 Hibernate 源代码,它说(快捷方式)如果实体实现 FieldHandled 并且如果 FieldHandler 不脏,则什么也不做。

这是我的代码:

@Controller
@Transactional
public class CustomerContactController {

    ....

    @ModelAttribute
    public CustomerContactAddressDTO getCustomerContactAddress(final HttpServletRequest request) {
        CustomerContactAddressDTO customerContactAddressDTO = new CustomerContactAddressDTO();
        customerAddress = customerAddressDao.findById(customerAddressUid);
        customerContactAddressDTO.setCustomerContact(customerAddress.getCustomerContact());
        return customerContactAddressDTO;       
    }

    @Secured(UserService.ROLE_PREFIX + "right.customer.contact.update")
    @RequestMapping(value = "/customer/contact/formedit/{customerContactAddressDTOUid}", method = RequestMethod.POST)
    public @ResponseBody
    ReturnFormResult formEditSubmit(@ModelAttribute CustomerContactAddressDTO customerContactAddressDTO,
            @PathVariable final String customerContactAddressDTOUid) {

        final CustomerAddress customerAddress = customerContactAddressDTO.getCustomerAddress();

        ReturnFormResult rfr = new ReturnFormResult();
        rfr.setMode("update");
        rfr.setStatus(Boolean.TRUE);

        customerAddressDao.saveOrUpdate(customerAddress);

        return rfr;
    }
}

实体:

@Entity
@Table(name = "t_customer_contact_address")
public class CustomerAddress implements FieldHandled{

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "customer_contact_address_uid", updatable = false)
    private String id;

    ....

    @Basic(fetch=FetchType.LAZY)
    @Formula("(some native sql query)")
    private String groupTransactionCodes;


    private FieldHandler fieldHandler;

    @Override
    public void setFieldHandler(FieldHandler handler) {
        this.fieldHandler = handler;

    }

    @Override
    public FieldHandler getFieldHandler() {     
        return fieldHandler;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {  
        this.id = id;       
    }

    public String getGroupTransactionCodes() {
        if(fieldHandler!=null){
            return (String)fieldHandler.readObject(this, "groupTransactionCodes", groupTransactionCodes);
        }       
        return groupTransactionCodes;
    }

    public void setGroupTransactionCodes(String groupTransactionCodes) {
        this.groupTransactionCodes = groupTransactionCodes;
    }   
}

这是休眠代码源

!FieldInterceptionHelper.isInstrumented( entity ) = false 因为我的实体被入侵了

FieldInterceptionHelper.extractFieldInterceptor( entity) 返回我的实体的 fieldHandler 是脏的 == false

真&&(假||假||假)=假

休眠源代码:

as mightBeDirty == false 对他来说更新不是必要的,也不安排更新。

我的问题: 当我在已检测的分离实体上使用 saveOrUpdate() 时,如何才能真正更新数据库中的数据?

谢谢

数据库配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="packagesToScan" value="com.XXXX.db.pojo"/>
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">com.XXXX.application.utils.MSSQLAHEADDialect</prop>
                <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.use_sql_comments">false</prop>
                <prop key="hibernate.hbm2ddl.auto">validate</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.generate_statistics">true</prop>
            </props>
        </property>
        <property name="eventListeners">
            <map>
                <entry key="save-update" value-ref="saveEventListener" />
                <entry key="flush-entity" value-ref="flushEntityEventListener" />
                <entry key="post-load" value-ref="postLoadEventListener" />

            </map>
        </property>
    </bean>

    <bean id="saveEventListener" parent="callbackHandlerEventListener" class="org.hibernate.ejb.event.EJB3SaveOrUpdateEventListener" />

    <bean id="flushEntityEventListener" parent="callbackHandlerEventListener" class="org.hibernate.ejb.event.EJB3FlushEntityEventListener" />

    <bean id="postLoadEventListener" parent="callbackHandlerEventListener" class="org.hibernate.ejb.event.EJB3PostLoadEventListener" />

    <bean id="entityCallbackHandler" class="org.hibernate.ejb.event.EntityCallbackHandler" />

    <bean id="callbackHandlerEventListener" abstract="true" class="org.hibernate.ejb.event.CallbackHandlerConsumer">
        <property name="callbackHandler" ref="entityCallbackHandler" />
    </bean>

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/dataSourceAHEAD"/>
    </bean>

【问题讨论】:

  • 这里抛出休眠配置。
  • 您是否尝试过将属性添加到休眠 hibernate.connection.autocommit 并将其设置为 true

标签: spring hibernate spring-mvc


【解决方案1】:

我只是在保存之前就这样做了: customerAddress.getFieldHandler().writeObject(customerAddress, "name", customerAddress.getName(), customerAddress.getName());

它会强制脏被编码为真。 我觉得当一个实体实现 FieldHandled 时,它会阻止任何类型的自动运行时检测。我认为我应该像这样手动实现所有 setter:

    public void setXXX(String xxx) {
            getFieldHandler().writeObject(this, "xxx", this.xxx, xxx);
            this.xxx = xxx;
    }

在每个 setter 中手动调用 writeObject。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多