Tapestry5 Value Encoder с композитным ключом Hibernate - PullRequest
0 голосов
/ 28 февраля 2012

Я пытаюсь заставить мой кодировщик значений гобелена работать с составным ключом гибернации. У меня есть следующий код, и я пытаюсь получить составной идентификатор и передать его интерфейсу, где он позже может быть отправлен обратно на сервер для декодирования обратно в объект.

@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 ]

1 голос
/ 07 марта 2012

Hibernate не может знать, что означает эта строка, и не может преобразовать ее обратно. Я предлагаю добавить некомпозитный идентификатор или объединить значения, которые вы затем разделите в методе toValue.

Если вы сохраняете ValueEncoder дольше, чем ваш запрос (например, с @Persist), вы можете добавить в него HashMap, чтобы легко вернуть объект для конкатернированного клиентского ключа;

Поскольку ваш составной ключ является сериализуемым, вы можете сериализовать его в toClient и десериализовать в toValue. Однако я бы на самом деле этого не сделал, сериализация и отправка его в браузер и обратно - большая злая дыра в безопасности.

0 голосов
/ 03 марта 2012

Я думаю, что проблема с вашей строкой:

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

На этом этапе ваше "clientValue" является строкой, генерируемой IfasvVendorPK.toString()

Я не уверен, что это должно работать в спящем режиме, если вы не передаете экземпляр 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.

...