我想在数据库中保存大附件(500Mb,如果可能,甚至> 2Gb).我知道这样做的利弊经常被讨论,但这不是我的问题的焦点.
使用JPA在EJB3中存储Blob字段的传统方法是使用如下代码:
@Lob
private byte[] data;
Run Code Online (Sandbox Code Playgroud)
处理大量数据源时会出现问题,因为整个字节数组都保存在内存中.
我试图将其更改为Blob:
@Lob
private Blob data;
Run Code Online (Sandbox Code Playgroud)
但这会导致同样的问题.打电话的时候
// session: Hibernate session.
// Actually, I'd like to stay with JPA's abstraction and not
// reference Hibernate directly, if possible
Blob data = session.createBlob(inputStream, lengthOfStream);
Run Code Online (Sandbox Code Playgroud)
createBlob方法从inputStream创建一个byteArray.
由于ORM映射,我也想知道如何处理数据的插入.一个想法是创建一个实体变量
@Lob
private byte[] data;
Run Code Online (Sandbox Code Playgroud)
我永远不会用.这样,数据库模式就可以构建了.但是因为@Lob注释是懒惰的,所以它不会让我的记忆膨胀.
然后写
entityManager.persist(dataObject);
// The following lines are _completely_ imaginatory!!
query.prepare("update DataObject d set d.data = :dataInputStream where d = :dataObject");
query.setProperty("dataObject", dataObject);
query.setProperty("dataInputStream", someDataInputStream);
Run Code Online (Sandbox Code Playgroud)
我偶然发现的一个解决方案看起来不错,但是没有使用JPA: Grooviest方法将BLOB存储在数据库中?
有人建议怎么做吗?
我想通过一个提交按钮提交多个表单.我有多种形式,因为每个p:fileUpload都需要一个自己的表单(当处于高级模式时).
这是我的提交按钮的代码:
<h:form id="form1">...</h:form>
<h:form id="form2">...</h:form>
<h:form>
<p:commandButton value="Save" widgetVar="saveButtonBottom"
action="#{bean.submit}" ajax="false"
process=":form1,:form2,@this" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
它确实调用了bean.submit(),但它不处理其他形式.也许我对处理的理解是错误的,但我想如果我把表单放入"流程",那么它将被提交.
知道如何让它工作吗?