2

こんにちは、私のプロジェクトの 1 つで 1 対多の関係を持ちたいのですが、リストが読み込まれません。

親ソースクラスがあります

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class ParentJob {
  @Id
  @Column(name = "ID")
  int id;
}

子供

@Entity
public class TakeJob extends ParentJob {
  @OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.REMOVE)
  @JoinColumn(name="FK_JOBID", referencedColumnName="ID")
  private List<JobRelation> jobRelations;
}

および対象エンティティ

@Entity
public class JobRelation {
  @EmbeddedId
  private JobRelationPK JobRelationPK;
}

PKで

@Embeddable
public class JobRelationPK implements Serializable {
  private long fkSomething;
  @Column(name = "FK_JOBID")
  private long fkJobId;
}

私が言ったように、リストにアクセスしてもリストは作成されません。JoinColumn の構文に特に興味があります。「name」に何を入力してもまったく問題にならないからです。そこに入力した内容に注意を払う必要がありますか、それとも「name = "COLUMN_NAME_IN_JOBRELATION"」と入力するだけでよいですか

編集:EclipseLink 2.3.2を使用しています

4

2 に答える 2

3

ここでの問題は、おそらく、JobRelation テーブルの「FK_JOBID」フィールドの設定方法にあると思われます。

マッピングした方法では、埋め込まれた JobRelationPK の fkJobId 属性と TakeJob の jobRelations マッピングの両方を介して書き込み可能です。JobRelation エンティティでのみ設定している場合、TakeJob コレクションは更新時にのみ変更を反映します。JPA では、関係を維持して、データベース内の内容と一致させる必要があります。これは、TakeJob のコレクションに JobRelation を追加して参照がデータベース内のものと同期されるようにするか、変更がコミットされた後にそれを更新する必要があることを意味します。

ただし、このフィールドには 2 つのマッピングがあるため、書き込みの問題を回避するには、結合列を読み取り専用に設定する必要があります。

より良い解決策は、JobRelation で ManyToOne リレーションを TakeJob にセットアップし、TakeJob の jobRelations マッピングがこの新しいマッピングによってマップされるように設定することです (joincolumn を使用する代わりに)。JPA 2.0 を使用している場合は、新しいマッピングを @MapsId("fkJobId") として指定できます。何かのようなもの:

@Entity public class JobRelation {
   @EmbeddedId
   private JobRelationPK JobRelationPK;
   @ManyToOne
   @MapsId("fkJobId")
   private TakeJob job;
 } 

これにより、埋め込まれた fkJobId 属性を、挿入時に参照された TakeJob Id の値で設定できるようになります。

于 2012-06-26T16:52:32.783 に答える
1

最初に、エンティティ階層内のどこに注釈を配置するかについて一貫性を保つ必要があります。常にフィールドに配置するか、常にゲッターに配置してください。@Id アノテーションがidフィールドに配置されているため、getter のアノテーションは無視されます。

これが修正されたら、namein@JoinColumnは結合列の名前にする必要があります。したがって、これは、TakeJob テーブルへの外部キーである JobRelation テーブル内の列の名前でなければなりません。

于 2012-06-26T14:15:02.967 に答える