Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 维克特酒店;使用Blob休眠实体_Hibernate_Serialization_Blob_Wicket - Fatal编程技术网

Hibernate 维克特酒店;使用Blob休眠实体

Hibernate 维克特酒店;使用Blob休眠实体,hibernate,serialization,blob,wicket,Hibernate,Serialization,Blob,Wicket,我正在尝试将文件实体从byte[]模型更改为Blob 原始代码: @Entity @Table(name="raw_data") public class RawDataEntity extends DomainObject { @Lob private byte[] data; 新代码: @Entity @Table(name="raw_data") public class RawDataEntity extends DomainObject { @Lob pri

我正在尝试将文件实体从byte[]模型更改为Blob

原始代码:

@Entity
@Table(name="raw_data")
public class RawDataEntity extends DomainObject {
  @Lob
  private byte[] data;
新代码:

@Entity
@Table(name="raw_data")
public class RawDataEntity extends DomainObject {

    @Lob
    private Blob data;
它工作得很好,但是我需要使用这个实体作为Seriazable-use-in-Wicket页面。。 (我不能使用DetachableModel或删除序列化,因为有一个hibernate实体的大模型需要序列化..)


希望你们中的一位能够帮助我。

您可以使Blob暂时化,然后它将不会被序列化,但在反序列化时它将为空:

private transient Blob data;
我认为您唯一的其他选择是为blob创建一个单独的对象,并且只在RawDataEntity中引用它,并在请求时使用LoadableDetachableModel重新加载它

public class BlobModel extends LoadableDetachableModel<Blob> {

    private int id;

    public BlobModel(int id) {
        this.id = id;
    }

    @Override
    protected Blob load() {
        return dao.getObject(id);
    }
}
接下来创建您自己的序列化程序:

public class CustomSerializer extends JavaSerializer {
public CustomSerializer(String applicationKey) {
    super(applicationKey);
}

@Override
public byte[] serialize(Object object) {
    if (object instanceof CustomSerialize) {
        super.serialize(((CustomSerialize) object).getSerializable(object));
    }
    return super.serialize(object);
}

@Override
public Object deserialize(byte[] data) {
    Object object = super.deserialize(data);
    if (object instanceof CustomSerialize) {
        return ((CustomSerialize) object).getUnserializable(object);
    }
    return object;
}
}
然后在无法序列化的页面上实现该接口,并编写这两个方法。getSerializable()应该创建一个实现CustomSerializer的对象,以便getUnserializable()返回相同的页面

最后,在wicket Web应用程序中使用新的序列化程序:

    getFrameworkSettings().setSerializer(new CustomSerializer(getApplicationKey()));

在hibernate中,transient关键字是否可用于持久化字段?如果我理解JPA的hibernate实现,它不会像Yes中描述的那样持久化瞬态字段或瞬态注释字段,瞬态也意味着它不会持久化。是否可以以任何方式更改实体?因为Blob对象无法序列化,所以必须在某个地方进行更改。为什么不能对整个实体使用可加载模型?可加载可分离模型不能解决持久性问题。如果对象由hibernate持久化(使用hibernate版本控制),则所有字段都由hibernate持久化/管理。但您可以提取blob并仅使用此对象中的id访问单独持久化对象中的blob。然后,您可以在wicket页面中使用此对象,并可以对其进行序列化。然后,您可以使用blob的id和可加载模型来访问blob。另一个选项是创建自己的序列化方法。但是我没有这方面的经验。谢谢你的回复,这几乎是完美的。我刚刚发现一个问题,我的实体在另一个实体中,CustomSerializer只应用于第一个实体。。(第二个是由标准java序列化程序序列化的),但我希望我能解决它:)
    getFrameworkSettings().setSerializer(new CustomSerializer(getApplicationKey()));