使用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语句,因此在自动提交模式下不安全。对于非常大的字段,首选大型对象,原因有两个:
@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地图,走到一条直上的通道。我仍然得到错误,我已经尝试过使它成为事务性的,等等。那么我应该通过链接磨磨和承受它吗?