2010-09-02 1 views
0

Это то, что я действительно хотел бы сделать - разрешить имена на основе значений id, не получая всю дочернюю модель.JPA для получения значения имени из дочерней таблицы без использования модели для ребенка

Вот пример того, что у меня есть, за столом говорят Employee и Name_Details стол Работник может выглядеть следующим образом

Create Table Employee { 
    emp_idinteger not null generated by default as identity; -- generated pk 
    Department varchar(44); 
    emp_name_id Integer; -- fk to Name_Details table 
    ...other details such as hire_date etc.. 
} 

Теперь emp_id является внешним ключом к таблице name_details, которая может выглядеть следующим образом : -

Create Table Name_Details { 
    id Integer; 
    Name varchar(32); 
    Address Varchar(127); 
    Postcode Varchar(10); 
    --other details.. 
} 

Мой вопрос заключается в том, что я хотел бы, чтобы смоделировать первую таблицу Employee с классом Java, но я не заинтересован в установлении отношений один-к-одному между классом Employee и таблицей Name_Details получить это целое N Таблица ame_details (как ее довольно большая), единственная информация, которую я хочу получить от этого второго класса, - это просто поле Name (найденное путем соединения столбца emp_name_id с столбцом Name_Details.id. Так что, возможно, в JPA сказать, что в моем классе Employee объявлено что-то вроде переходной переменной, называемой именем String employeeName, и получить это от JPA на основе вышеуказанного отношения? Это упрощенный пример того, что у меня есть несколько таблиц с парами имя-значение, а главная таблица имеет значения. Мне это нужно для чтения, а не обновление/удаления и т.д. Я не использую JPA v1.x с EJB3 (а не спящим режимом) на WPS 6,1

Thx G

+0

Я не знаю, есть ли какая-либо другая возможность, кроме отношения один к одному ... но, возможно, @NamedNativeQuery поможет ... – cyphorious

ответ

1

Есть несколько вариантов.

Первый заключается в том, чтобы просто создать класс Name, который сопоставляется с Name_Details, но отображает только поля имени и идентификатора. Сотрудник будет иметь имя OneToOne для имени, и только имя будет считано.

Второй вариант определяет Name_Details как @SecondaryTable в Employee и отображает только имя из него. Спецификация JPA ограничивает соединение вторичной таблицы, чтобы иметь общий идентификатор, но в зависимости от того, какой поставщик JPA вы используете, возможно использование внешнего ключа 1-1 (EclipseLink действительно поддерживает это). Вы также можете определить представление, соединяющее и отображающее представление.

Третьим решением является сохранение всех полей Name_Details, но определение их как LAZY. Если ваш поставщик JPA поддерживает основы LAZY (или группы извлечения), они не будут извлекаться, если не будут доступны.