您的JPA映射似乎不错。显然,@ Lob要求数据类型为byte [] / Byte []
/或java.sql.Blob。基于此,再加上您的症状和调试打印输出,看来您的代码在执行正确的数据操作(JPA批注很好),但是spring +
MySQL的组合没有提交。这表明您的Spring事务性配置或MySQL数据类型存在一个小问题。
1.交易行为
JpadocumentRepository.java中的相关代码是:
@PersistenceContextprivate EntityManager em;@Overridepublic void save(document document) { if (document.getId() == null) {this.em.persist(document);} else {this.em.merge(document);}}- 您没有使用EJB(因此没有“自动”容器管理的事务)。
- 您正在Servlets / java类中使用JPA(因此,您需要在Servlet容器外部,在代码中或通过Spring config进行“手动”事务划分)。
- 您通过以下方式注入实体管理器
@PersistenceContext
(即,由JTA支持的容器管理的实体管理器,而不是实体管理器资源本地事务em.getTransaction()
) - 您已将“父”方法标记为
@Transactional
(即,spring专有事务-注释后来在Java EE 7中进行了标准化)。
注释和代码应具有交易行为。您是否为JTA事务正确配置了Spring?(使用JtaTransactionManager,而不是提供JDBC驱动程序本地事务的DataSourceTransactionManager)Spring
XML应该包含与以下内容非常相似的内容:
<!-- JTA requires a container-managed datasource --><jee:jndi-lookup id="jeedataSource" jndi-name="jdbc/mydbname"/><!-- enable the configuration of transactional behavior based on annotations --><tx:annotation-driven transaction-manager="txManager"/><!-- a PlatformTransactionManager is still required --><bean id="txManager" > <!-- (this dependency "jeedataSource" must be defined somewhere else) --> <property name="dataSource" ref="jeedataSource"/> </bean>
怀疑其他参数/设置。
这是Spring必须执行的手动编码版本(仅出于理解目的,请不要对此进行编码)。使用UserTransaction(JTA),而不是EntityTransaction类型的em.getTransaction()(JDBC本地):
// inject a reference to the servlet container JTA tx@Resource UserTransaction jtaTx;// servlet container-managed EM@PersistenceContext private EntityManager em;public void save(document document) { try { jtaTx.begin(); try { if (document.getId() == null) {this.em.persist(document);} else {this.em.merge(document);} jtaTx.commit(); } catch (Exception e) { jtaTx.rollback(); // do some error reporting / throw exception ... } } catch (Exception e) { // system error - handle exceptions from UserTransaction methods // ... }}2. MySQL数据类型
如此处所示(底部),与其他数据库相比,MySql
Blob有点特殊。各种Blob及其最大存储容量为:
TINYBLOB-255字节BLOB-65535字节MEDIUMBLOB-16,777,215字节(2 ^ 24-1)LONGBLOB-4G字节(2 ^
32 – 1)
如果(2)成为您的问题:
- 将MySQL类型增加到MEDIUMBLOB或LONGBLOB
- 调查为什么您没有看到错误消息(非常重要)。是否正确配置了日志记录?您检查日志了吗?



