Java Lob使用play framework、Ebean和H2返回null

Java Lob使用play framework、Ebean和H2返回null,java,playframework,h2,playframework-2.3,ebean,Java,Playframework,H2,Playframework 2.3,Ebean,我正在用Play2.3(Ebean和H2)为java开发一个程序。我有一个这样的模型: @Entity public class DeviceModel extends Model implements PathBindable<DeviceModel> { @Id public Long id; @Lob @Basic(fetch=FetchType.LAZY) public byte[] picture; ... 有趣的是,deviceModel.picture为空 但

我正在用Play2.3(Ebean和H2)为java开发一个程序。我有一个这样的模型:

@Entity
public class DeviceModel extends Model implements PathBindable<DeviceModel> {

@Id
public Long id;


@Lob
@Basic(fetch=FetchType.LAZY)
public byte[] picture;

...
有趣的是,
deviceModel.picture
为空

但在我看来,我有:

        @if(deviceModel.picture != null) {
                show the picture!
        } else{
            do something else
        }
但是在这里,
deviceModel.picture
不是空的!!!大多数情况下,图片都会正确显示

我删除了
@Basic(fetch=FetchType.LAZY)
,但它没有解决问题


知道为什么会这样吗?

我找到了解决这个问题的方法,但我仍然想知道原因,为什么直接访问picture字段会返回null

以下是解决方法: 我只是将我的
图片
字段设置为私有,并将getter和setter设置为我自己。现在,在我的控制器中,使用
getPicture()
我总是能得到数据

@Entity
public class DeviceModel extends Model implements PathBindable<DeviceModel> {

@Id
public Long id;


@Lob
@Basic(fetch=FetchType.LAZY)
private byte[] picture;


public byte[] getPicture() {
    return picture;
}

public void setPicture(byte[] picture) {
    this.picture = picture;
}

...
@实体
公共类DeviceModel扩展模型实现可路径绑定{
@身份证
公共长id;
@高球
@基本(fetch=FetchType.LAZY)
私有字节[]图片;
公共字节[]getPicture(){
返回图片;
}
公共无效设置图片(字节[]图片){
这个图片=图片;
}
...

这种行为的原因是
FetchType.LAZY
(这显然也是LOB的默认设置)。它告诉Ebean以延迟方式获取数据,即在加载对象时不立即获取数据,而仅在实际访问对象时才获取数据

由于当您直接进入字段(
picture
)时,Ebean无法检测到访问,因此加载根本不会发生,您会得到
null

通过使用Ebean增强了其代码的
getPicture()
,它知道在返回值之前加载数据


只需使用
FetchType.EAGER
,您就可以克服这种行为。但是,如果您确定始终需要数据,您应该这样做,因为这需要更多的时间和内存(例如,在您的示例中,如果您有100张图片,并且您只想显示一个名称列表,则不必同时加载所有图片的实际图像数据。

只是猜测:您的模板实际使用的是getPicture()方法,而不是直接访问字段。也许您在这个方法中有一些额外的代码以某种方式转换图片的字节[]?感谢您的提示。作为解决方案,我将图片字段设置为私有,并将getter和setter设置为我自己。现在使用getPicture()我总是能得到数据这对我来说正是正确的解决方案,因为@behzad solution不起作用
@Entity
public class DeviceModel extends Model implements PathBindable<DeviceModel> {

@Id
public Long id;


@Lob
@Basic(fetch=FetchType.LAZY)
private byte[] picture;


public byte[] getPicture() {
    return picture;
}

public void setPicture(byte[] picture) {
    this.picture = picture;
}

...