gpt4 book ai didi

java - 如何在没有 JoinTable 的情况下在 JPA 中创建一对多关系?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:14:18 25 4
gpt4 key购买 nike

我正在尝试使用以下表结构在 JPA 中创建 @OneToMany 关系。

+----------------+
| CATALOG |
+----------------+
| catalogId : PK |
| name |
+----------------+
|
+----------------+
| PRODUCT |
+----------------+
| productId : PK |
| name |
| catalogId : FK |
+----------------+

我已经将类定义为

@Entity
public class Catalog {
@Id
@GeneratedValue
long catalogId;

@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "catalogId",
nullable = false, insertable = true, updatable = true)
Set<Product> products = new HashSet<>();

String name;
}

@Entity
public class Product {
@Id
@GeneratedValue
long productId;

String name;
}

但是,当我尝试保留目录对象时,EclipseLink 没有按预期放入 catalogId 值,我得到了一个 SQL 约束违规,有一个 null。

此外,我不需要也不希望在产品端使用@ManyToOne。

持久化代码:

final Catalog catalog = new Catalog();
catalog.name = text;
final Product p = new Product();
p.name = text;
catalog.products.add(p);
em.persist(catalog);

堆栈跟踪:

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Column 'CATALOGID'  cannot accept a NULL value.
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1367)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1295)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1301)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:866)
at net.trajano.maven_jee6.ws_mdb_ejb_web.TextMessages.putText(TextMessages.java:61)

最佳答案

当您将一个表 Product 上的列的所有权授予另一个实体 Catalog 时,该列将作为持久目录的一部分进行更新和维护,而不是作为持久产品的一部分。该框架将创建一个产品,但由于 FK 列由另一个实体“拥有”,因此它将使用在目录持久化时生成的单独更新语句来填充它。您需要使列可以为 null,或者将列的所有权置于映射表的同一实体上。

关于java - 如何在没有 JoinTable 的情况下在 JPA 中创建一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11044948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com