我正在尝试让我的 Tapestry 值编码器与 hibernate 复合键一起使用。我有以下代码,我正在尝试获取复合 id 并将其传递到接口(interface),稍后可以将其发送回服务器以解码回对象。
@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 是我需要将复合 key 发送到接口(interface)的地方。我不确定如何获取复合 key 。
@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();
}
};
}
如果有人可以帮助我更好地理解如何使用复合键,以便我可以让我的值编码器工作,我将不胜感激。提前致谢。
最佳答案
Hibernate 无法知道该字符串的含义,也无法将其转换回来。 我建议添加一个非复合 ID 或连接这些值,然后在 toValue 方法中再次拆分这些值。
如果您保留 ValueEncoder 的时间比您的请求长(例如使用 @Persist),您可以在其中放入 HashMap 以轻松获取对象以获取串联的客户端 key ;
由于您的复合键是可序列化的,因此您可以在 toClient 中对其进行序列化,并在 toValue 中对其进行反序列化。但是,我真的不会这样做,序列化内容并将其发送到浏览器并返回是一个巨大而邪恶的安全漏洞。
关于java - 带 Hibernate 复合键的 Tapestry5 值编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9483870/