簡體   English   中英

如何在沒有JoinTables的JPA中創建一對多關系?

[英]How do you to create a one to many relationship in JPA with no JoinTables?

我正在嘗試使用以下表結構在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列由另一個實體“擁有”,它將使用在持久保存目錄時生成的單獨更新語句來填充它。 您需要使列可以為空或將列的所有權放在映射表的同一實體上。

我認為這是由於缺少@GeneratedValue注釋(使用Postgres )。 根據我的經驗,使用Postgres ,您的注釋不起作用。 您需要指定@SequenceGenerator@GeneratedValue 這是一個例子:



    @SequenceGenerator(name = "lan_generator", sequenceName = "lan_pkey_seq")
    @Id
    @GeneratedValue(generator = "lan_generator")
    @Column(name="id", unique=true, nullable=false)
    private Integer id;

如果您正在使用其他數據庫,請嘗試處理您的數據庫。 無論如何,在giveb鏈接中,當您使用MySQL時,您有一個可能的解決方案。 可能它也適用於你的“內存中的derby實例”。

如何使用JPA注釋注釋MYSQL自動增量字段

制作這樣的產品類,然后再試一次 -

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

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "catalogId", updatable = false, insertable = false, nullable=false)  
    private Catalog  catalog ;

    String name;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM