使用Spring MVC/Hibernate';大对象不能在自动提交模式下使用';

使用Spring MVC/Hibernate';大对象不能在自动提交模式下使用';,hibernate,postgresql,Hibernate,Postgresql,当然这看起来很简单,但是我在我的应用程序上下文中添加了以下内容 <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.d

当然这看起来很简单,但是我在我的应用程序上下文中添加了以下内容

<property name="dataSource">
    <ref bean="dataSource"/>
</property>

<property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.autocommit">false</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.gleason.gt.server.model.database.PlayListEntry</value>
            <value>com.gleason.gt.server.model.database.MusicFile</value>
        </list>
    </property>
</bean>


org.hibernate.dialogue.PostgreSqlDialogue
真的
假的
com.gleason.gt.server.model.database.playEntry
com.gleason.gt.server.model.database.MusicFile
我还是会犯同样的错误,有什么想法吗

更新 添加服务/DAO

@Repository("musicFileDao")
public class MusicFileDAOImpl extends GroovyTimeHibernateDAOSupport{
@Transactional()
public MusicFile getMusicFile(Integer i){
    @SuppressWarnings("unchecked")
    List<MusicFile> returnValue = (List<MusicFile>)getHibernateTemplate().find("from MusicFile where id=?",i);
    if(returnValue.size()>0){
        return returnValue.get(0);
    }
    return null;
}
}
@Service("musicFileService")
public class MusicFileService {
@Autowired
private MusicFileDAOImpl dao;

@Transactional
public MusicFile getMusicFile(Integer i){
    return dao.getMusicFile(i);
}
}

@Lob
@Column(name="file")
private byte[] file;
@Repository(“musicFileDao”)
公共类MusicFileDAOImpl扩展了GroovyTimeHibernateDAOSupport{
@事务性()
公共音乐文件getMusicFile(整数i){
@抑制警告(“未选中”)
List returnValue=(List)getHibernateTemplate().find(“来自音乐文件,其中id=?”,i);
if(returnValue.size()>0){
返回returnValue.get(0);
}
返回null;
}
}
@服务(“音乐文件服务”)
公共类音乐文件服务{
@自动连线
私人音乐文件;
@交易的
公共音乐文件getMusicFile(整数i){
返回dao.getMusicFile(i);
}
}
@高球
@列(name=“file”)
私有字节[]文件;

最基本的一点是,大型对象是它自己的东西,与bytea完全不同。如果要查找字节数组,请使用bytea

大型对象是一个独立的数据库实体,它使用不同的接口保存,然后使用对象id引用。这需要两个SQL语句,因此在自动提交模式下不安全。对于非常大的字段,首选大型对象,原因有两个:

  • 你可以在一个大的物体中储存两倍于你在茶杯中所能储存的量,并且

  • 大型对象带有流接口,允许按偏移量搜索等。它们的操作更像文件,而不像数据库属性

  • 大型对象在合适的位置非常有用,但它们有些不同寻常。你很可能想喝杯茶。

    使用Spring boot 2+ 有两种方法:

    创建一个配置数据源的配置类,并更改Hikari行为

    @Configuration
    public class DataSourceConfiguration {
    
        // (...) some @Value(s) (...)
    
        @Bean
        public DataSource getDataSource() {
    
            HikariConfig config = new HikariConfig();
            config.setDriverClassName(driverClassName);   
            config.setJdbcUrl(url);
            config.setUsername(username);
            config.setPassword(password);
    
            // these are optional
            config.setMinimumIdle(minumunIdle);
            config.setMaximumPoolSize(maximunPoolSize);
            config.setPoolName(poolName);
            config.setConnectionTimeout(connectionTimeout);
            config.setIdleTimeout(idleTimeout);
            config.setMaxLifetime(maxLifetime);
    
            // sets auto-commit to false
            config.setAutoCommit(false);
    
            return new HikariDataSource(config);
        }
    }
    
    或者在application.properties中,可以设置此键/值:

    spring.datasource.hikari.auto-commit=false
    

    我的评论与另一个问题中的评论相同:我很确定您不想要较大的对象,而是
    bytea
    。请参阅上的手册。它们与其他任何东西都大不相同。谢谢你的评论,我认为我可以使用LargeObject作为字节数组?我试图查看链接,但有点过头了。在其他新闻中,我试图孤立它。我拿出OneToOne地图,走到一条直上的通道。我仍然得到错误,我已经尝试过使它成为事务性的,等等。那么我应该通过链接磨磨和承受它吗?