首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有Hibernate组合键的Tapestry5值编码器

问具有Hibernate组合键的Tapestry5值编码器
EN

Stack Overflow用户
提问于 2012-02-28 22:37:21
回答 2查看 448关注 0票数 0

我正在尝试让我的tapestry值编码器使用hibernate组合键。我有以下代码,我正在尝试获取复合id并将其传递给接口,在接口中稍后可以将其发送回服务器以解码回一个对象。

代码语言:javascript
复制
@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是我需要将组合键发送到接口的位置。我不确定如何获得组合键。

代码语言:javascript
复制
@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();
        }
    };
}  

如果有人能帮助我更好地了解如何使用组合键,这样我就可以让我的值编码器工作,这将是非常感谢。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-07 18:36:57

Hibernate无法知道这个字符串的含义,也无法将其转换回来。我建议添加一个非复合ID,或者将这些值连接起来,然后在toValue方法中再次拆分。

如果保留ValueEncoder的时间比请求的时间长(例如,使用@ HashMap ),您可以在其中放置一个持久化,以便轻松地获取连接的客户机键的对象;

由于您的组合键是可序列化的,因此可以在toClient中序列化它,并在toValue中反序列化它。然而,我真的不会那样做,序列化内容并将其发送到浏览器并返回是一个巨大的、邪恶的安全漏洞。

票数 1
EN

Stack Overflow用户

发布于 2012-03-03 12:13:26

我想问题出在你的线路上:

return (IfasvVendor) session.get(IfasvVendor.class, clientValue);

此时,IfasvVendorPK.toString()生成的"clientValue“是一个字符串

我不确定这是否可以在hibernate中工作,您不应该向session.get传递一个IfasvVendorPK实例吗

您可以测试这是否应该与以下内容一起工作:

代码语言:javascript
复制
    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发送到session.get之前将其转换回IfasvVendorPK。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9483870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档