2012-02-28 2 views
0

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

@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(); 
     } 
    }; 
} 

Если кто-то может помочь мне лучше понять, как работать с составным ключом, чтобы я мог получить мое значение датчика работает, было бы весьма признателен. Заранее спасибо.

+1

1. Продемонстрируйте реализацию toString() в классе IfasvVendor. 2. Каков тип переменной сеанса? 3. Вы уверены, что объект IfasvVendor доступен в сеансе? Предпочтительнее извлекать его из хранилища данных, чем из сеанса. – Jeshurun

ответ

1

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

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

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

+0

Я закончил конкатенировать мои значения, так как я меняю базу данных на использование не-составного идентификатора, это не вариант. Я использую метод в Jumpstart, который не использует @Persist, который, кажется, работает хорошо, за исключением проверки на стороне сервера. Не могли бы вы рассказать о том, как сериализация может быть большой дырой в безопасности. Благодарю. –

+0

на вопрос о сериализации: если вы сериализуете весь объект (а не только идентификатор), вы можете открыть интерфейс для ввода произвольных объектов, просто заменив их другим сериализованным объектом - например, с объектом, который регистрирует внутренние вещи где-то , Я не думаю, что это легко, но можно злоупотреблять этим. – dube

0

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

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.

+0

У меня не было возможности опробовать ваше предложение, в конце концов я конкатенировал свой составной ключ, я скоро проверю ваше решение. –

Смежные вопросы