我试图创建一个使用下表结构JPA一个@OneToMany关系。如何在没有JoinTables的情况下在JPA中创建一对多关系?
+----------------+
| 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违反约束,有是空的。
而且,我不需要也不想要在产品端的@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)
您正在使用什么数据库? id列自动增量还是您有一些序列发生器?尝试给id一个值,并保存,如果它的工作。 –
我认为你的问题与关系无关,我认为它与主键声明有关。看到我的答案。 – artaxerxe
我使用的是Hibernate的实体管理器(虽然的EclipseLink或OpenJPA将最终部署) –