@OneToMany Bidirectional - Join Column插入“null”值(Hibernate)

时间:2017-11-29 19:40:36

标签: java hibernate jpa hibernate-onetomany

我有2个模型/注释类,ProductDetails和VnfDetails。 我想使用JPA HIbernate

加入带有@OnetoMany关系的2个表 使用@OnetoMany Mapping

ProductDetails 模型类如下:

@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 低于@CanytoOne和JoinColumn:

@Entity
@Table(name="vnf_details")
public class VnfDetails {


@Id
@Column(name="VNF_ID")
private String vnfId;

@Column(name="VNF_NAME")
private String vnfName;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PRODUCT_ID")
private ProductDetails productDetails;

public ProductDetails getProductDetails() {
    return productDetails;
}

public void setProductDetails(ProductDetails productDetails) {
    this.productDetails = productDetails;
}

public String getVnfId() {
    return vnfId;
}

public void setVnfId(String vnfId) {
    this.vnfId = vnfId;
}

public String getVnfName() {
    return vnfName;
}

public void setVnfName(String vnfName) {
    this.vnfName = vnfName;
}

当我插入数据时,数据被插入但是 VnfDetails 表中的 PRODUCT_ID 为空。

应该是具有PRODUCT_DETAILS表“ ID ”的外键。

无法解决问题。

4 个答案:

答案 0 :(得分:3)

在“单向映射”中,我遇到类似的问题,即在外键列中插入空值,并出现运行时异常datavoilation异常。

通过在@JoinColumn上添加nullable = false来解决问题,例如

@OnetoMany
@JoinColumn(nullable=false) 

并删除了子实体中的外键列定义。

答案 1 :(得分:2)

由于这是双向关系,因此您需要确保插入每个实体并引用关系的另一侧,因为您在产品详细信息中级联vndf,您应该执行此类操作

productDetails.setVndf(vndfList);//vndfList is having one item for example
vndfList.get(0).setProductDetails(productDetails);
productDetailsDao.save(productDetails);

答案 2 :(得分:0)

在productDetails中没有任何引用的情况下在onetoManyClass中定义joinColumn。

@OneToMany 
@JoinColumn(name="qid") 
private Set<VnfDetails> vnfd;

答案 3 :(得分:-2)

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PRODUCT_ID")
private ProductDetails productDetails;

PRODUCT_ID不是ProductDetails实体中的PK,这就是您的映射不起作用的原因。尝试将其更改为ID列,它应该可以正常工作。