我正在尝试让我的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();
}
};
}
如果有人可以帮我更好地理解如何使用复合键,那么我可以让我的价值编码器工作,我们将不胜感激。提前致谢。
答案 0 :(得分:1)
Hibernate无法知道该字符串的含义,也无法将其转换回来。 我建议添加一个非复合ID或者将这些值再次放在你的toValue方法中。
如果你保持ValueEncoder比你的请求更长(例如@Persist),你可以在其中放入一个HashMap,以便轻松获取对象以获得一个连续的客户端密钥;
由于您的Composite键是可序列化的,您可以在toClient中序列化它并在toValue中反序列化它。然而,我真的不会这样做,序列化东西并将其发送到浏览器并返回是一个很大的,邪恶的安全漏洞。
答案 1 :(得分:0)
我认为问题在于您的行:
return (IfasvVendor) session.get(IfasvVendor.class, clientValue);
此时,您的“clientValue”是一个字符串,由IfasvVendorPK.toString()
我不确定这应该在hibernate中工作,你不应该将IfasvVendorPK
的实例传递给session.get
吗?
您可以测试这是否适用于以下内容:
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
转换回IfasvVendorPK
,然后再将其发送到session.get
。