我的设置是Spring JPA/Hibernate/Oracle.
DB中有一个触发器,它对一行中的多个字段执行一些基本操作(例如,对保存为字符串的小数执行舍入).
当然,当我从ORM中保存所述行时,它不会获取触发器所做的更改,除非我执行了em.refresh(myRow).
由于我使用的是扩展JpaRepository的接口,因此我只能在使用repos的任何地方执行此操作(或实现此特定存储库并覆盖保存方法).
Hibernate还有一个@Generated注释可能会起作用,虽然它更像是一个hack,因为它不是它的用途.
可以用其他方式完成吗?
实际任务是能够通过从文件中读取来返回Stream,但是这样做而不将整个文件(或解析的集合)完全加载到内存中.该流的目的可以在以后确定 - 例如保存到DB.开发人员将拥有反序列化流的句柄(而不是反序列化的集合).
问题是,不能保证文件中的一行等于一个MyEntity对象(在这种情况下我可以使用这篇文章:http://blog.codeleak.pl/2014/05/parsing-file-with -stream-api-in-java-8.html)
通常,可以找到这样的情况:如果输入流,则需要返回通过将可变数量的输入流项映射到一个输出流项而构造的输出流.
所以,到目前为止,我的解决方案是使用供应商,如下所示:
public class Parser{
public Stream<MyEntity> parse(final InputStream stream) {
return Stream.generate(new AggregatingSupplier(stream));
}
private class AggregatingSupplier implements Supplier<MyEntity> {
private final Scanner r;
public AggregatingSupplier(final InputStream source) {
this.r= new Scanner(source);
}
@Override
public MyEntity get() {
MyEntity re=new MyEntity();
while (r.hasNextLine() &&!re.isComplete()){
String line=r.nextLine();
// ... do some processing
}
return re;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于使用Stream.generate获得的流是无限的.没有停止条件.抛出一个异常(有点).或者选择完全不同的(经典)方法.