我有一个应用程序必须处理一个对象列表(使用JPA从数据库中检索),其中包含一个序列化的图像。
问题在于,当我收集存储在数据库中的此对象的大约50个实例时,从数据库加载50张图片(约5秒)变得非常慢,这对用户来说很烦人。
有没有办法将此列从数据库设置为延迟初始化?或者我应该创建一个单独的对象来携带图像,并使用ID引用它?
感谢您的帮助。
答案 0 :(得分:1)
Hibernate至少允许使用惰性列(使用@Basic
注释的fetch属性),但我认为并不是所有JPA供应商都支持它。
是否真的有必要将图像存储在数据库中?将它们存储在文件系统中通常更有效,并且只在数据库中存储路径。
答案 1 :(得分:0)
是的,有一个layz loading attriubte属性。
@Basic(fetch = FetchType.LAZY)
private String myBigString;
来自JPA 2.0规范
11.1.6基本注释基本注释是到数据库列的最简单的映射类型。 Basic注释可以应用于a 任何以下的持久属性或实例变量 types:Java原始类型,原始类型的包装, java.lang.String,java.math.BigInteger,java.math.BigDecimal, java.util.Date,java.util.Calendar,java.sql.Date,java.sql.Time, java.sql.Timestamp,byte [],Byte [],char [],Character [],枚举和 实现Serializable的任何其他类型。
...
FetchType枚举定义了从中获取数据的策略 database:public enum FetchType {LAZY,EAGER};
...
LAZY策略是对持久性提供程序运行时的暗示 首次访问时,应该懒散地获取数据。该 允许实现急切地获取LAZY的数据 策略提示已被指定。特别是,懒惰提取可能 仅适用于基于属性的访问的基本映射 使用。
另一种技术是对同一个表进行第二次映射,但只能使用您需要的属性。