我正在尝试让我的tapestry值编码器使用hibernate组合键。我有以下代码,我正在尝试获取复合id并将其传递给接口,在接口中稍后可以将其发送回服务器以解码回一个对象。
@Embeddable
public class IfasvVendorPK implements Serializable{
@Column(length = 4, nullable = false)
protected String peId;
@Column(length = 8, nullable = false)
protected String peAddrCd;
public IfasvVendorPK() {
}
public IfasvVendorPK(String peId, String peAddrCd) {
this.peId = peId;
this.peAddrCd = peAddrCd;
}
// equals, hashCode
}
@Entity
public class IfasvVendor implements Serializable {
@EmbeddedId
private IfasvVendorPK ifasvVendorPK;
//...
} 下面是我的值编码器。toClient是我需要将组合键发送到接口的位置。我不确定如何获得组合键。
@SuppressWarnings("unchecked")
public LabelAwareValueEncoder getEncoderVendor() {
return new LabelAwareValueEncoder<IfasvVendor>() {
public String toClient(IfasvVendor value) {
return value.getIfasvVendorPK().toString();
}
public IfasvVendor toValue(String clientValue) {
if (clientValue.isEmpty()) {
return null;
}
return (IfasvVendor) session.get(IfasvVendor.class, clientValue);
}
public String getLabel(IfasvVendor value) {
return value.getPeNameU();
}
};
} 如果有人能帮助我更好地了解如何使用组合键,这样我就可以让我的值编码器工作,这将是非常感谢。提前谢谢。
发布于 2012-03-07 18:36:57
Hibernate无法知道这个字符串的含义,也无法将其转换回来。我建议添加一个非复合ID,或者将这些值连接起来,然后在toValue方法中再次拆分。
如果保留ValueEncoder的时间比请求的时间长(例如,使用@ HashMap ),您可以在其中放置一个持久化,以便轻松地获取连接的客户机键的对象;
由于您的组合键是可序列化的,因此可以在toClient中序列化它,并在toValue中反序列化它。然而,我真的不会那样做,序列化内容并将其发送到浏览器并返回是一个巨大的、邪恶的安全漏洞。
发布于 2012-03-03 12:13:26
我想问题出在你的线路上:
return (IfasvVendor) session.get(IfasvVendor.class, clientValue);
此时,IfasvVendorPK.toString()生成的"clientValue“是一个字符串
我不确定这是否可以在hibernate中工作,您不应该向session.get传递一个IfasvVendorPK实例吗
您可以测试这是否应该与以下内容一起工作:
public String toClient(IfasvVendor value) {
// test toValue strategy (probably breaks):
System.out.println(
session.get(IfasvVendor.class, value.getIfasvVendorPK().toString()));
// test toValue strategy (probably works):
System.out.println(
session.get(IfasvVendor.class, value.getIfasvVendorPK()));
return value.getIfasvVendorPK().toString();
}因此,如果我是对的,那么在toValue中需要做的就是在将String发送到session.get之前将其转换回IfasvVendorPK。
https://stackoverflow.com/questions/9483870
复制相似问题