Hibernate 维克特酒店;使用Blob休眠实体
我正在尝试将文件实体从byte[]模型更改为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
@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()));