Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa @目标具有复合密钥时的OneToMany关系?_Jpa_Eclipselink - Fatal编程技术网

Jpa @目标具有复合密钥时的OneToMany关系?

Jpa @目标具有复合密钥时的OneToMany关系?,jpa,eclipselink,Jpa,Eclipselink,嗨,我想为我的一个项目建立一对多的关系,但列表从未填充过 我有一个父源类 @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.

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

我有一个父源类

@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;
}
用PK

@Embeddable
public class JobRelationPK implements Serializable {
  private long fkSomething;
  @Column(name = "FK_JOBID")
  private long fkJobId;
}
现在,正如我所说,如果我访问它,列表不会填充。我对JoinColumn的语法特别感兴趣,因为我为“name”输入什么并不重要,即使它完全是垃圾。我是否必须注意我放在那里的内容,或者我可以只把'name=“COLUMN\u name\u放入\u JOBRELATION”'


编辑:我使用的是EclipseLink 2.3.2

您首先应该在实体层次结构中放置注释的位置保持一致。总是把它们放在字段上,或者总是放在getter上。由于@Id注释放在
Id
字段上,因此将忽略getter上的注释


修复后,
@JoinColumn
中的
名称必须是名称。。。连接列的。因此,它必须是JobRelation表中作为TakeJob表外键的列的名称。

您首先应该在实体层次结构中放置注释的位置保持一致。总是把它们放在字段上,或者总是放在getter上。由于@Id注释放在
Id
字段上,因此将忽略getter上的注释


修复后,
@JoinColumn
中的
名称必须是名称。。。连接列的。因此,它必须是JobRelation表中作为TakeJob表外键的列的名称。

这里的问题可能是如何设置JobRelation表的“FK_JOBID”字段


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

但是,由于有两个映射到此字段,因此需要将联接列设置为只读,以避免写入问题

更好的解决方案可能是在JobRelation上设置与TakeJob的多通关系,然后将TakeJob的jobRelations映射设置为通过此新映射进行映射(而不是使用joincolumn)。如果使用JPA2.0,则可以将新映射指定为@MapsId(“fkJobId”)。比如:

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

这将允许嵌入的fkJobId属性在插入时使用引用的TakeJob Id中的值进行设置

这里的问题可能是如何设置JobRelation表的“FK_JOBID”字段


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

但是,由于有两个映射到此字段,因此需要将联接列设置为只读,以避免写入问题

更好的解决方案可能是在JobRelation上设置与TakeJob的多通关系,然后将TakeJob的jobRelations映射设置为通过此新映射进行映射(而不是使用joincolumn)。如果使用JPA2.0,则可以将新映射指定为@MapsId(“fkJobId”)。比如:

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

这将允许嵌入的fkJobId属性在插入时使用引用的TakeJob Id中的值进行设置

我在getter上有它们,但不想把我的示例搞得一团糟。但第二次就搞砸了。我最初的名字和你说的一样,但不起作用。所以我想知道它是否与复合键有关。我在getter上有它们,但不想把我的示例弄得一团糟。但第二次就搞砸了。我最初的名字和你说的一样,但不起作用。所以我想知道它是否与复合键有关。“或者在提交更改后刷新它”在查找元素之前调用
em.clear()
或者在查找元素之后调用
em.refresh()
就足够了吗?基本上,我用JobRelationPK保存一个新的JobRelation。当我这样做时,我没有TakeJob对象可用。所以我不能手动将其添加到代码中。我还认为这是JPA的重点,所以我不必关心在何处/何时添加JobRelations,而是根据数据库中的数据将它们添加到TakeJob中。当我在Java中手动添加它们时,我的示例运行得很好,但是我不需要
@OneToMany
注释。基本上,我想做的是创建/持久化作业关系,而不涉及TakeJob。但是希望在访问TakeJob时填充它们。“或者在提交更改后刷新它”在我查找元素之前或之后调用
em.clear()
是否足够。当我这样做时,我没有TakeJob对象可用。所以我不能手动将其添加到代码中。我还认为这是JPA的重点,所以我不必关心在何处/何时添加JobRelations,而是根据数据库中的数据将它们添加到TakeJob中。当我在Java中手动添加它们时,我的示例运行得很好,但是我不需要
@OneToMany
注释。基本上,我想做的是创建/持久化作业关系,而不涉及TakeJob。但希望在访问TakeJob时填充它们。