我有一个webapp,用户可以上传文件(通过multipart/form-data
),然后将它们与元数据一起存储在带有Hibernate(@Entity class Document
)的数据库中。
目标表有一个BLOB列content
,其中保存了文件的内容。然后,允许上载文件的用户在基于GWT的UI中修改一些元数据(例如,原始文件名)。为此,我使用Dozer将Document
实例转换为ClientDocument
实例,该实例没有content
字段,并且可以为GWT序列化。一旦修改后的ClientDocument
实例从浏览器到达,我将其转换回Document
并执行此操作:
ClientDocument document = ...;
Document entity = dozerBeanMapper.map(document, Document.class);
Session session = sessionFactory.getCurrentSession();
session.merge(entity);
此时entity
的{{1}}列被清除,因为Dozer显然没有填写相应的BLOB数据。
有没有办法避免在content
期间更新此特定BLOB content
列?我见过Not committing an hibernate entity field to the DB,但merge()
解决方案对我不起作用,因为我需要为后端的其他操作获取@Transient
BLOB。
有什么建议吗?
答案 0 :(得分:1)
你可以告诉Hibernate不要更新字段
<property name="fieldName" insert="true" update="false"/>
使用注释将是这样的:
@Column(insertable = true, updatable = false)
请注意,该字段是可插入的,这意味着它将被插入,但下次您要更新实体时,它将不会更新。