您好,我想为我的一个项目建立一对多关系,但列表从未填充。
我有一个父源类
@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/