jpa - 当目标有复合键时@OneToMany 关系?

标签 jpa eclipselink

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

我有一个父源类

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

一个 child

@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

最佳答案

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

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

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

更好的解决方案可能是在 JobRelation 上设置到 TakeJob 的 ManyToOne 关系,然后将 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 属性。

关于jpa - 当目标有复合键时@OneToMany 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11207887/

相关文章:

MySQL/JPA : How create a correclty relation and cascade?

java - ManyToMany with CascadeType.ALL 导致 Detached entity passed to persist

orm - 如何在 jpql 查询中仅查询父类(super class)实体?

java - 使用 Jersey 客户端 2.2 版的 Restful WebService 调用

java - 组织.hibernate.AnnotationException : referencedColumnNames referencing not mapped to a single property

spring-boot - 无论 CascadeTypes 如何,都无法在不删除父实体的情况下删除子实体?

postgresql - 使用 glassfish 4 和 Postgres 在 eclipselink 中创建数据库不起作用

hibernate - JPA ConstraintViolation 与回滚

java - Eclipse 警告 : class javax. 持久性。* 未找到

java - Hibernate/JPA 是否考虑了 transient 修饰符(而不是注释)