![](/img/trans.png)
[英]how to create controllers for objects with a one to many relationship with 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實例”。
制作這樣的產品類,然后再試一次 -
@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.