Java @OneToMany双向连接列正在插入;空";值(休眠)
我有两个模型/注释类ProductDetails和VnfDetails。 我想使用JPA HIbernate连接具有@OnetoMany关系的两个表 ProductDetails模型类如下所示,带有@OnetoMany映射:Java @OneToMany双向连接列正在插入;空";值(休眠),java,hibernate,jpa,hibernate-onetomany,Java,Hibernate,Jpa,Hibernate Onetomany,我有两个模型/注释类ProductDetails和VnfDetails。 我想使用JPA HIbernate连接具有@OnetoMany关系的两个表 ProductDetails模型类如下所示,带有@OnetoMany映射: @Entity @Table(name="product_details") public class ProductDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(nam
@Entity
@Table(name="product_details")
public class ProductDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ID")
private int id;
@Column(name="PRODUCT_ID")
private String productId;
@Column(name="PRODUCT_NAME")
private String productName;
@OneToMany(mappedBy="productDetails", cascade=CascadeType.ALL)
private Set<VnfDetails> vnfd;
public Set<VnfDetails> getVnfd() {
return vnfd;
}
public void setVnfd(Set<VnfDetails> vnfd) {
this.vnfd = vnfd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
当我插入数据时,数据被插入,但
VnfDetails表中的产品ID为空
它应该是具有PRODUCT_DETAILS表的“ID”的外键
无法解决此问题。由于这是一个双向关系,您需要确保插入的每个实体都引用了关系的另一端,因为您将vndf级联到产品详细信息中,所以您应该执行以下操作
productDetails.setVndf(vndfList);//vndfList is having one item for example
vndfList.get(0).setProductDetails(productDetails);
productDetailsDao.save(productDetails);
PRODUCT_ID不是ProductDetails实体中的PK,这就是映射不起作用的原因。尝试将其更改为ID列,它应该可以正常工作。在单向映射中,我遇到了类似的问题,即它在外键列中插入空值,并获得运行时异常datavoilation异常 通过在
@JoinColumn
上添加nullable=false,问题得到了解决
@OnetoMany
@JoinColumn(nullable=false)
并删除了子实体中的外键列定义。在onetoManyClass中定义joinColumn,而不在ProductDetails中进行任何引用
@OneToMany
@JoinColumn(name="qid")
private Set<VnfDetails> vnfd;
@OneToMany
@JoinColumn(name=“qid”)
私有集vnfd;
我正在从我的bean类中提取并将其设置为model类,如下所示VnfDetails v=new VnfDetails();ProductDetails p=新的ProductDetails();Set vnfList=new HashSet();v.setVnfId(product.getVnfId());v.setVnfName(product.getVnfName());vnfList.add(v);p.setProductId(product.getProductId());p.setProductName(product.getProductName());p.setVnfd(vnfList);this.productDAO.addProduct(p);
是的,您缺少在vndf中设置productdetails的部分,因此需要在productdetails p=new productdetails()之后添加;v、 setProductDetails(p);不,这是不正确的,联接列的名称可以是任何不是解决方案的内容。您不应该为此更改DB架构。必须有另一种解决办法。
@OnetoMany
@JoinColumn(nullable=false)
@OneToMany
@JoinColumn(name="qid")
private Set<VnfDetails> vnfd;