如何在没有JoinTables的JPA中创建一对多关系?

Arc*_*ano 3 java jpa one-to-many

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

+----------------+
| CATALOG        |
+----------------+
| catalogId : PK |
| name           |
+----------------+
      |
+----------------+
| PRODUCT        |
+----------------+
| productId : PK |
| name           |
| catalogId : FK |
+----------------+
Run Code Online (Sandbox Code Playgroud)

我已经将类定义为

@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;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试持久化目录对象时,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);
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

Aff*_*ffe 7

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