15

我有 2 个名为 PurchaseList.java 和 PurchaseListItems.java 的类

我必须在 PurchaseListItems 中映射 PurchaseList

采购清单.java

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="pl_id",referencedColumnName="id")
private List<PurchaseListItems> purchaseListItems;

PurchaseListItems.java

@ManyToOne
@JoinColumn(name="pl_id")
private PurchaseList purchaseListId;

一切都很好,但我在 pl_id 中得到了空值。请告诉我哪里错了

4

7 回答 7

8

由于某种原因,映射的对我来说不适用于 postgres sql 和 Hibernate4

下面的映射工作

采购清单.java

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="pl_id",nullable=false)
private List<PurchaseListItems> purchaseListItems;

PurchaseListItems.java

@ManyToOne
@JoinColumn(name="pl_id", nullable=false,insertable=false,updatable=false )
private PurchaseList purchaseListId;

注意:您必须使用身份或明确提及 postgres 的 id 列的序列。

@GeneratedValue(strategy=GenerationType.IDENTITY)
于 2015-04-20T16:29:48.633 回答
5

您的映射实际上定义了两个独立的单向关系。你想要的是一个双向关系。下面的代码将建立双向关系

@OneToMany(cascade = CascadeType.ALL, mappedBy = "purchaseListId")
@JoinColumn(name="pl_id",referencedColumnName="id")
private List<PurchaseListItems> purchaseListItems;

mappedBy 属性是必需的,因为提供者无法自动确定指定的关系实际上形成了单个关系。可以使用实例成员的 Java 类型,但如果您有多个相同类型的成员怎么办。在很多情况下,你有两个单一的关系。例子:

OneToMany: User -> ForumThread(用户创建的话题)

ManyToOne:ForumThread -> User(关闭线程的用户。显然不一定是启动线程的人)

这是两个独立的关系,必须这样对待。如果您的持久性提供只是因为类型和多重性匹配而从中建立了双向关系,您会感到非常惊讶。

另请注意,任何 JPA 提供程序都不会自动管理双向关系,这意味着反向关系不会在您的对象模型中自动更新/设置,因此不会在数据库中。你必须自己做。顺便说一句,在我所有的项目中,双向关系都让人头疼,我认为避免它们是可取的。

于 2013-03-14T16:35:58.453 回答
2
  1. @JoinColumn 注释属于关系的 @ManyToOne 一侧 - 但不属于 @OneToMany 一侧 - 将其从 @OneToMany 一侧删除。

  2. Cascade 用于级联 DELETE/READ/UPDATE 操作...,但它不会自动填充外键“子”侧的 ID 列。事实上,它不会填充对 FK 关系两侧对象的 java 引用。您需要在双向关系的两侧手动设置关系数据:

    myPurchaseListItem.setPurchaseList(myPurchaseList);
    myPurchaseList.setPurchaseListItem(myPurchaseListItem);

    从 JPA 2 规范:

    托管实体之间的双向关系将基于关系拥有方持有的引用进行持久化。开发人员有责任保持拥有方的内存引用和相反方的内存引用在更改时彼此保持一致。在单向一对一和一对多关系的情况下,开发人员有责任确保(原文如此)关系的语义得到遵守。 [29]

    尤其重要的是要确保对关系反向端的更改会导致拥有端的适当更新,以确保更改同步到数据库时不会丢失。

于 2013-03-14T05:46:51.683 回答
1
for(PurchaseListItems item:purchaseListItemsList)
item.purchaseListId(PurchaseList);

这是我在创建对象时错过的。

感谢您的回答

于 2013-03-13T08:01:40.003 回答
0

当您创建PurchaseListItems值时,检查您是否使用有效值(创建的PurchaseList实例)填充了 purchaseListId

最好使用mappedBy如下代码让多方维护关系。

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "purchaseListId")
@JoinColumn(name="pl_id",referencedColumnName="id")
private List<PurchaseListItems> purchaseListItems;
于 2013-03-12T12:14:18.087 回答
0

尝试这个

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "purchaseListId")
于 2013-03-08T05:26:04.413 回答
0

jpa 规范看起来不错,但请确认您在数据库中提供了有效的父子关系。如果没有引用,那么它将返回 null。

于 2013-03-08T05:23:28.083 回答