带有Hibernate复合键的Tapestry5 Value Encoder

时间:2012-02-28 14:37:21

标签: java hibernate tapestry

我正在尝试让我的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();
        }
    };
}  

如果有人可以帮我更好地理解如何使用复合键,那么我可以让我的价值编码器工作,我们将不胜感激。提前致谢。

2 个答案:

答案 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