JPA2, добавляющий ссылочное ограничение в таблицу, усложняет запрос критериев с отложенной выборкой, нужен совет

Ниже приводится много писанины для того, что я считаю довольно простой проблемой. Корень проблемы - мое невежество, ищу не столько код, сколько совет.

Таблица: столбец Ininvhst (история инвентаризации схемы инвентаризации) ihtran (код передачи истории инвентаризации) с использованием старого сопоставления сущностей, которое у меня есть:

@Basic(optional = false)
@Column(name = "IHTRAN")
private String ihtran;

ihtran на самом деле является внешним ключом к таблице Intrnmst («Мастер переноса запасов», которая содержит список «кодов переноса»). Это не было выражено в базе данных, поэтому на Ininvhst было наложено ссылочное ограничение на повторное создание классов сущностей JPA2:

@JoinColumn(name = "IHTRAN", referencedColumnName = "TMCODE", nullable = false)
@ManyToOne(optional = false)
private Intrnmst intrnmst;

Раньше я использовал JPA2 для выбора записей/(сущностей Ininvhst) из таблицы Ininvhst, где «ihtran» был одним из набора значений. Я использовал in.value() для этого... вот фрагмент:

        cq = cb.createQuery(Ininvhst.class);
        ...
        In<String> in = cb.in(transactionType); //Get in expression for transacton types
        for (String s : transactionTypes) { //has a value
            in = in.value(s);//check if the strings we are looking for exist in the transfer master
        }
        predicateList.add(in);

Моя проблема в том, что Ininvhst раньше содержал строку с именем ihtran, но теперь он содержит Ininvhst... Итак, теперь мне нужно выражение пути:

    this.predicateList = new ArrayList<Predicate>();
    if (transactionTypes != null && transactionTypes.size() > 0) { //list of strings has some values
        Path<Intrnmst> intrnmst = root.get(Ininvhst_.intrnmst); //get transfermaster from Ininvhst
        Path<String> transactionType = intrnmst.get(Intrnmst_.tmcode); //get transaction types from transfer master
        In<String> in = cb.in(transactionType); //Get in expression for transacton types
        for (String s : transactionTypes) { //has a value
            in = in.value(s);//check if the strings we are looking for exist in the transfer master
        }
        predicateList.add(in);
    }

Могу ли я добавить ihtran обратно в объект вместе со столбцом соединения, в котором обе ссылки являются «IHTRAN»? Или я должен использовать проекцию, чтобы каким-то образом вернуть Ininvhst вместе со строкой ihtran, которая теперь является частью сущности Intrnmst. Или я должен использовать проекцию, чтобы вернуть Ininvhst и каким-то образом ограничить Intrnmst только строкой ihtran.

Дополнительная информация: я использую полученный список выбранных объектов Ininvhst в веб-приложении, класс, содержащий список объектов Ininvhst, преобразуется в объект json. Вероятно, существует довольно много методов сериализации, которые будут перемещаться по графу объектов. Проблема в том, что моя текущая стратегия выборки ленива, поэтому она попадает в сущность соединения (Intrnmst intrnmst), и в этот момент нет доступного диспетчера сущностей. На данный момент я предотвратил сериализацию столбца соединения объектом, но теперь мне не хватает важной части данных.

Я думаю, что сказал слишком много, но не зная достаточно, я не знаю, что вам, экспертам JPA, нужно. Я хотел бы, чтобы мой исходный объект имел как строковый объект, так и возможность присоединиться к одному и тому же столбцу (ihtran), но если это невозможно или нецелесообразно, я хочу услышать, что мне делать и почему.

Псевдокод/английский более чем в порядке.


person Quaternion    schedule 18.01.2011    source источник


Ответы (1)


Могу ли я добавить ihtran обратно в объект вместе со столбцом соединения, в котором обе ссылки являются «IHTRAN»?

да. Просто сделайте один из них доступным только для чтения (insertable/updateable=false)

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

Если вы получите доступ к отношению до его сериализации, оно будет доступно. В противном случае сделайте это EAGER или присоединитесь к выборке в своем запросе.

person James    schedule 18.01.2011