Сопоставление сущности JPA необязательному SecondaryTable - PullRequest
6 голосов
/ 10 ноября 2010

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

@Entity
@Table( name = "program", schema = "myschema" )
@SecondaryTable( name = "program_info", schema = "myschema", pkJoinColumns =
        @PrimaryKeyJoinColumn( name = "program_id", referencedColumnName = "program_id" ) )
public class Program { ... }

У меня есть все столбцы, сопоставленные соответствующим образом, и модульный тест, который работает.Проблема возникает, когда у меня есть строка в таблице программ, которая не имеет соответствующей строки в таблице program_info.В этом случае он не будет загружать программу вообще.Мне нужно иметь возможность пометить всю дополнительную таблицу как необязательную.Я предпочел бы избежать необходимости создавать другую сущность / дао / службу и выполнять сопоставление 1-1.

Я использую eclipselink, но хотел бы держаться подальше от конкретных сведений о поставщике, если могу.1006 *

Ответы [ 2 ]

9 голосов
/ 11 ноября 2010

Мне нужно пометить всю дополнительную таблицу как необязательную.

EclipseLink выполнит INNER JOIN с SecondaryTable, поэтому, если в дополнительной таблице нет соответствующей строки, вы ничего не получите.Другими словами, EL ожидает найти строку во вторичной таблице (при создании, чтении, обновлении, удалении).

Если вам нужно OUTER JOIN, вам следует использовать необязательную ассоциацию OneToOne (возможно, с общим первичным ключом в вашем случае).

Альтернативой может быть использование представления базы данных (выполнение OUTER JOIN) и отображение этого представления.

Я быпредпочитают избегать создания другой сущности / дао / службы и выполнять сопоставление 1-1.

Я не понимаю, почему наличие необязательного OneToOne заставляет вас иметь соответствующий DAOи сервис.Управляйте необязательной деталью через основную деталь «держатель».

См. Также

0 голосов
/ 01 ноября 2018

TopLink, EclipseLink: Если база данных поддерживает использование из внешнего объединения синтаксиса в предложении where (Oracle, Sybase, SQL Server), тогда выражение объединения нескольких таблиц может использоваться для настройки внешнего соединения , используемого для чтения таблицы.

Есть мой настройщик для Eclipselink сущность с несколькими таблицами в базе данных oracle

public class OuterJoinCustomizer implements DescriptorCustomizer {

  public void customize(ClassDescriptor descriptor) {
    Map<DatabaseTable, Map<DatabaseField, DatabaseField>> tables =
        descriptor.getAdditionalTablePrimaryKeyFields();

      ExpressionBuilder builder = new ExpressionBuilder();
      Expression expression = null;

      for (Map.Entry<DatabaseTable, Map<DatabaseField, DatabaseField>> table :
          descriptor.getAdditionalTablePrimaryKeyFields().entrySet()) {
        Expression criteria = null;

        for (Map.Entry<DatabaseField, DatabaseField> fields : table.getValue().entrySet()) {
              // NOTE: equalOuterJoin (+)= SUPPORTED BY ORACLE!
              Expression fieldExp =
              builder.getField(fields.getValue()).equalOuterJoin(builder.getField(fields.getKey()));
          criteria = (criteria == null) ? fieldExp : criteria.and(fieldExp);
        }

        if (criteria != null)
          expression = (expression == null) ? criteria : expression.and(criteria);
      }

      if (expression != null)
        descriptor.getQueryManager().setMultipleTableJoinExpression(expression);
    }

  }
}

В Hibernate намного проще

@Table(optional = true)
...