Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带Hibernate复合键的Tapestry5值编码器_Java_Hibernate_Tapestry - Fatal编程技术网

Java 带Hibernate复合键的Tapestry5值编码器

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 =

我试图让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();
        }
    };
}  
@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),您可以打开一个接口来注入任意对象,只需将它们替换为另一个序列化对象—例如,将内部内容记录到某个位置的对象。我认为这不容易,但也有可能滥用它。