繁体   English   中英

JPA实体映射到可选的SecondaryTable

[英]JPA entity mapping to optional SecondaryTable

我有一个实体。 我想可以选择从辅助表中加载有关实体的其他信息。 我有以下映射。

@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表中有相应的行时,就会出现问题。 在这种情况下,它根本不会加载程序。 我需要能够将整个辅助表标记为可选。 我宁愿不必创建另一个实体/ dao / service并进行1-1映射。

我正在使用eclipselink,但如果可以的话,我希望远离提供商的具体细节。

我需要能够将整个辅助表标记为可选。

EclipseLink将使用SecondaryTable执行INNER JOIN ,因此如果辅助表中没有相应的行,您将什么也得不到。 换句话说,EL期望在辅助表中找到一行(在创建,读取,更新,删除时)。

如果您想要的是OUTER JOIN ,则应使用可选的OneToOne关联(在您的情况下可能使用共享主键)。

另一种方法是使用数据库视图(执行OUTER JOIN )并映射视图。

我宁愿不必创建另一个实体/ dao / service并进行1-1映射。

我不明白为什么有一个可选的OneToOne强迫你拥有相应的DAO和服务。 通过主“支架”部分管理可选部件。

也可以看看

TopLink,EclipseLink: 如果数据库支持在where子句(Oracle,Sybase,SQL Server)中使用 外连接语法,则可以使用多表连接表达式来配​​置用于读取表的外连接

在oracle数据库上有我的Eclipselink多表实体定制器

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM