我需要一些JPA自引用关系的帮助。我认为有些事我没有正确定义。
我有一个名为ItemEntity的JPA实体bean。有两种类型的项目。父项和子项。父项可以有许多子项,子项只有一个父项。所以这真的是一个ManyToOne / OneToMany JPA自引用关系。
在我的数据库中,项目表看起来像这样......
item_no,parent_item_no,item_description
111,null,This is my parent item
222,111,This is my child item
所以在我的java程序中,当我在项目111上调用itemEntity.getChildren时,我希望看到222但是我得到了null。
以下是我定义JPA关系的方法......
@Entity(name = "stg_item")
public class ItemEntity implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "itemid")
@TableGenerator(name = "itemid", table = "stg_items_sequence", allocationSize = 1)
private Long id;
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "item_no", referencedColumnName = "parent_item_no")
private ItemEntity parent;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "parent")
private Collection<ItemEntity> children;
有谁能告诉我这里我做错了什么?
项目实体与我的另一个名为@ManyToOne
的实体之间存在stg_import_payload
关系。这是我正在使用的命名查询。也许我必须对命名查询做些特别的事情?
"SELECT x "
+ " FROM stg_import_payload x "
+ " WHERE x.processedInd='N' "
+ " AND EXISTS (SELECT stg_item FROM stg_item stg_item WHERE stg_item.importPayload = x AND stg_item.processedInd='N') ";
感谢。
答案 0 :(得分:6)
文档:
String javax.persistence.JoinColumn.referencedColumnName()
(可选)此外键列引用的列的名称。
当与此处描述的情况以外的实体关系映射一起使用时,引用的列位于目标实体的表中。 当与单向OneToMany外键映射一起使用时,引用的列位于源实体的表中。当在JoinTable注释中使用时,引用的键列位于拥有实体的实体表中,如果连接是反向连接定义的一部分。 在CollectionTable映射中使用时,引用的列位于包含该集合的实体的表中。 默认值(仅在使用单个连接列时适用):与引用表的主键列相同的名称。
你应该改变这个:
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "item_no", referencedColumnName = "parent_item_no")
private ItemEntity parent;
到
@ManyToOne(fetch = FetchType.LAZY, optional = true)
private ItemEntity parent;
它对我有用