java - 带 Hibernate 复合键的 Tapestry5 值编码器

标签 java hibernate tapestry

我正在尝试让我的 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/

相关文章:

java - 如何在 Struts 2 optgroup 中显示 Map 值的元素(对象列表)?

java - 如何在 Hibernate 中更新实体列表

java - 一对多双向关系在内存 HSQL DB 中不起作用

java - Tapestry : Start page use english locale instead of default locale

java - Tapestry @Persist(PersistenceConstants.FLASH) 与 Tomcat 相关,但与 Jetty 无关

javascript - 从 Tapestry 中的 JavaScript 函数内部提交表单

java - 如何使用在线 Java 编译器打开、读取和编辑系统上的文件(.txt 文件)?

java - 如何正确退出/断开telnet?

java - 如何使用 JavaFX 桌面应用程序包请求 UAC 管理权限?

mysql - 在 Hibernate 中使用 @ManytoMany 时,是否可以在提供者创建的连接表中设置非主键