1

私には次の2つのエンティティがあります。

  • Invoice
    • 主キーはInvoiceId
    • 関心のある他の列は[OrgId, VendorId, VendorInvoiceId]
  • InvoiceState
    • 主キーはInvoiceStateId
    • 関心のある他の列は[OrgId, VendorId, VendorInvoiceId]

「他の対象の列」は、両方のテーブルで一意のキーを形成します。ただし、2番目のテーブルにInvoiceStateは、最初のテーブルに対応するレコードがないレコードを含めることができますInvoice

エンティティレイヤーで、次のように、関係が定義されInvoiceたエンティティへの参照を含むようにエンティティを定義したいと思います。InvoiceState@OneToOne@JoinColumns

@OneToOne
@JoinColumns
({
    @JoinColumn(name="OrgId", referencedColumnName="OrgId"),
    @JoinColumn(name="VendorId", referencedColumnName="VendorId"),
    @JoinColumn(name="VendorInvoiceId", referencedColumnName="VendorInvoiceId")
})

ただし、これにより、外部キー数が両方のエンティティで同じではないという例外がスローされます。これら2つのテーブルの間に外部キーも定義されていません。

@OneToOne外部キーを共有しないが、実行中に使用できる列のセットを持つ2つのエンティティ間の関係を定義する方法はありJOINますか?

4

2 に答える 2

1

3 つのフィールドが一意である場合、それらを InvoicesState エンティティの PK としてマークすることができます。これにより、状態が oneToOne でそれらを参照できるようになります。JPA に使用される PK は、テーブル ID と一致する必要はなく、一意である必要があります。

一部のプロバイダーでは、マッピングで非 PK フィールドを参照できます。ただし、エンティティは通常 PK にキャッシュされるため、常に推奨されるとは限りません。そのため、参照を解決するために余分なデータベース ヒットが発生する可能性があります。Eclipselink では、フィールドの 1 つだけを使用してマッピングを偽造し、記述子カスタマイザーでマッピングを修正して、関係に残りのフィールドを追加することができます。

于 2012-10-21T13:34:17.173 に答える
1

上記の 3 つの列をcomponentusingとしてマッピングし、結合条件を使用して定義する@Embeddableためにコンポーネントを使用することをお勧めします。@Embedded

以下に例を示します。

  @Embeddable
  public class ReferenceInfo {

      private Long orgId = null;
      private Long vendorId= null;
      private Long vendorInvoiceId= null;

      .........
      .........
  }


  @Entity
  public class Invoces{

     private Long invoiceId = null;
     private ReferenceInfo refInfo = null;
     private InvoiceStates invoiceStates = null;

     @Id
     public Long getInvoiceId(){
        return invoiceId;
     }

     ......

      @Embedded
      public ReferenceInfo getRefInfo(){
        ....
      }

      @OneToOne(mappedBy="refInfo"))
      public InvoiceStates getInvoiceStates(){
        return invoiceStates;
      }
  }


  @Entity
  public class InvoiceStates {

     private Long invoiceStateId = null;
     private ReferenceInfo refInfo = null;

     @Id
     public Long getInvoiceStateId(){
        return invoiceStateId;
     }

     ......

      @Embedded
      public ReferenceInfo getRefInfo(){
        ....
      }
  }
于 2012-10-21T04:36:44.757 に答える