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