Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧&x2B;休眠设置不允许保存_Java_Hibernate_Spring - Fatal编程技术网

Java 弹簧&x2B;休眠设置不允许保存

Java 弹簧&x2B;休眠设置不允许保存,java,hibernate,spring,Java,Hibernate,Spring,是否有任何参数可以在hibernate中设置为临时不允许持久化,只允许只读(临时)?我可以在applicationcontext.xml中设置吗?您可以将事务标记为只读: @Transactional(readOnly=true) 我观察到的一个副作用是,当一个人忘记使一个方法具有事务性时,没有插入或更新,只有选择。您可以尝试完全省略事务声明 您也可以尝试: <prop key="org.hibernate.FlushMode">NEVER</prop> 从不 (或

是否有任何参数可以在hibernate中设置为临时不允许持久化,只允许只读(临时)?我可以在applicationcontext.xml中设置吗?

您可以将事务标记为只读:

@Transactional(readOnly=true)
我观察到的一个副作用是,当一个人忘记使一个方法具有事务性时,没有插入或更新,只有选择。您可以尝试完全省略事务声明

您也可以尝试:

<prop key="org.hibernate.FlushMode">NEVER</prop>
从不
(或
session.setFlushMode(FlushMode.NEVER)


如果这不起作用,您可以使用包装DAO调用,并且只有在设置了自定义配置属性的情况下才能继续使用
persist
方法。

Hibernate有一个方法
Session.setReadOnly(对象persisted,boolean readOnly)
,该方法允许您将持久化对象标记为只读

Hibernate 3.5还有
Session.setDefaultReadOnly(布尔值)
,可用于将会话检索到的所有对象设置为只读

接下来的挑战是如何在由
SessionFactory
创建的
Session
实例上设置此属性。我想象AOP可以用来代理LocalSessionFactoryBean来截取创建的
SessionFacotory
实例,将大多数方法委托给原始实例,但截取
openSession(…)
方法。但我对SpringAOP不太熟悉,在我看来,它很快就会变得很难理解。这里有一个直接的方法:

首先,在自定义实现中包装您的
LocalSessionFactoryBean

<bean name="sessionFactory" class="ReadOnlySessionFactoryBean">
   <constructor-arg>
      <bean class="LocalSessionFactoryBean">
       <!-- your existing session factory bean, 
            all your existing hibernate mappings, properties etc. -->
      </bean>
   </constructor-arg>
</bean>

仅此更改,代码的其余部分就可以不经修改地运行,并且每次都将获得一个只读SessionFactory。如果要绝对确保没有对数据库进行写入,可以覆盖写入数据库的方法,例如
saveOrUpdate
update
,尽管我不确定这是否真的有必要。

我会在数据库级别处理这一问题,并将应用程序配置为在演示过程中使用具有只读权限的用户(或者使用特定用户进行演示,或者更改当前使用的用户的权限)。简单、有效且保证以最少的努力工作。

但我不想在调用hibernate.updateOrMerge时抛出错误。当这个被调用时,我希望它不保存,不返回错误我不确定它是否抛出异常嗯,你确定吗?我设定了永不,永不,不能工作没有错误。。它仍然存在我的实体。您是否尝试过编程设置?(session.setFlushMode?)不,我没有尝试编程方式,我正在寻找设置@Cometa。你能说明你在尝试做什么以及为什么吗?@Arthur,假设我们有一个数据库中包含数据的web应用程序。出于演示目的,我们不希望我们的客户机对数据进行诱惑,所以,若可以在xml文件中设置只读模式,那个就好了。
public class ReadOnlySessionFactoryBean extends AbstractFactoryBean
{
    private AbstractSessionFactoryBean sessionFactoryBean;

    public ReadOnlySessionFactoryBean(AbstractSessionFactoryBean sessionFactoryBean)
    {
        this.sessionFactoryBean = sessionFactoryBean;
    }

    @Override
    public Class getObjectType()
    {
        return sessionFactoryBean.getObjectType();
    }

    @Override
    protected Object createInstance() throws Exception
    {
        SessionFactory factory = sessionFactoryBean.getObject();
        return new WrapSessionFactory(factory);
    }

    static class WrapSessionFactory implements SessionFactory
    {
        private Sessionfactory delegate;

        WrapSessionFactory(SessionFactory delegate)
        {
            this.delegate = delegate;
        }

        // delegate most methods to the delegate SessionFactory

        // override all the openSession(...) methods
        public Session openSession()
        {
            Session session = delegate.openSession();
            session.setDefaultReadOnly(true);
            return session;
        }
    }
}