Java 带Hibernate复合键的Tapestry5值编码器
我试图让tapestry值编码器使用hibernate复合键。我有下面的代码,我正在尝试获取复合id,并将其传递到接口,稍后可以将其发送回服务器,以便解码回对象Java 带Hibernate复合键的Tapestry5值编码器,java,hibernate,tapestry,Java,Hibernate,Tapestry,我试图让tapestry值编码器使用hibernate复合键。我有下面的代码,我正在尝试获取复合id,并将其传递到接口,稍后可以将其发送回服务器,以便解码回对象 @Embeddable public class IfasvVendorPK implements Serializable{ @Column(length = 4, nullable = false) protected String peId; @Column(length = 8, nullable =
@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();
}
};
}
@SuppressWarnings(“未选中”)
公共LabelAwareValueEncoder getEncoderVendor(){
返回新的LabelAwareValueEncoder(){
客户端的公共字符串(IfasvVendor值){
返回值.getIfasvVendorPK().toString();
}
公共IFASVvendorToValue(字符串clientValue){
if(clientValue.isEmpty()){
返回null;
}
return(IfasvVendor)session.get(IfasvVendor.class,clientValue);
}
公共字符串getLabel(IfasvVendor值){
返回值。getPeNameU();
}
};
}
如果有人能帮助我更好地理解如何使用复合键,这样我就可以让我的值编码器工作,我将不胜感激。提前谢谢 我想问题出在你的线路上:
return(IfasvVendor)session.get(IfasvVendor.class,clientValue)代码>
此时,“clientValue”是一个字符串,由IfasvVendorPK.toString()生成
我不确定这在hibernate中是否有效,您是否应该将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
中需要做的是将字符串
转换回ifasvendorpk
,然后再将其发送到会话。get
Hibernate无法知道该字符串的含义,无法将其转换回。
我建议添加一个非复合ID或concaternate值,然后在toValue方法中再次拆分这些值
如果您将ValueEncoder保留的时间长于您的请求(例如使用@Persist),您可以在其中放置一个HashMap,以便轻松地为一个concaternated客户端密钥获取对象
由于复合键是可序列化的,所以可以在toClient中序列化它,并在toValue中反序列化它。然而,我真的不会那样做,序列化内容并将其发送到浏览器并返回是一个巨大的、邪恶的安全漏洞。1。请在IfasvVendor类中显示toString()的实现。2.会话变量的类型是什么?3.您确定IfasvVendor对象在会话中可用吗?最好是从数据存储中检索,而不是从会话中检索。我没有机会尝试您的建议,我暂时连接了我的复合键,我将很快测试您的解决方案。我连接了我的值,因为我无法将数据库更改为使用非复合id。我在jumpstart中使用的方法不使用@Persist,除了服务器端验证之外,它似乎工作得很好。你能详细说明一下连载是如何成为一个巨大的安全漏洞的吗。感谢。对于序列化问题:如果序列化整个对象(不仅仅是ID),您可以打开一个接口来注入任意对象,只需将它们替换为另一个序列化对象—例如,将内部内容记录到某个位置的对象。我认为这不容易,但也有可能滥用它。