JPA2 добавление референтных противоречий в таблицу усложняет запрос критериев ленивой выборкой, нужен совет - PullRequest
0 голосов
/ 18 января 2011

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

Таблица: столбец 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), и в этот момент нет доступного Entity Manager. На данный момент я не позволил объекту сериализовать столбец соединения, но теперь мне не хватает критической части данных.

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

Псевдокод / ​​английский более чем хорошо.

1 Ответ

1 голос
/ 18 января 2011

Могу ли я добавить Ihtran обратно в сущность вместе со столбцом соединения, который является одновременно ссылки "ИХТРАН"?

Да. Просто сделайте один из них доступным только для чтения (вставляемый / обновляемый = ложный)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...