2

嗨,我想为我的一个项目建立一对多的关系,但从未填充过列表。

我有一个父源类

@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 =“COLUMN_NAME_IN_JOBRELATION”'

编辑:我正在使用 EclipseLink 2.3.2

4

2 回答 2

3

这里的问题可能与您期望如何设置 JobRelation 表的“FK_JOBID”字段有关。

您对其进行映射的方式使其可通过嵌入式 JobRelationPK 的 fkJobId 属性和 TakeJob 的 jobRelations 映射写入。如果您仅在 JobRelation 实体中设置它,那么 TakeJob 集合将仅在刷新时反映更改 - JPA 要求您维护关系,以便它们与数据库中的内容保持一致。这意味着您仍然必须将 JobRelation 添加到 TakeJob 的集合中,以便引用与数据库中的内容同步,或者在提交更改后刷新它。

但是因为您有两个到该字段的映射,所以需要将连接列设置为只读以避免写入问题。

更好的解决方案可能是在 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;
 } 

这将允许在插入时使用来自引用的 TakeJob Id 的值设置嵌入的 fkJobId 属性。

于 2012-06-26T16:52:32.783 回答
1

您首先应该在将注释放在实体层次结构中的位置上保持一致。始终将它们放在字段上,或始终将它们放在吸气剂上。您的 getter 上的注释将被忽略,因为 @Id 注释已放在id字段上。

修复此问题后,namein@JoinColumn必须是连接列的名称...。所以它必须是 JobRelation 表中列的名称,它是 TakeJob 表的外键。

于 2012-06-26T14:15:02.967 回答