【问题标题】:@OneToMany Bidirectional - Join Column is inserting "null" value (Hibernate)@OneToMany 双向 - 连接列正在插入“空”值(休眠)
【发布时间】:2018-05-13 14:51:36
【问题描述】:

我有 2 个模型/注释类,ProductDetails 和 VnfDetails。 我想使用 JPA HIbernate 加入具有 @OnetoMany 关系的 2 个表

ProductDetails 模型类在下面带有@OnetoMany 映射:

@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 下面是 @ManytoOne 和 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”的外键。

无法解决问题。

【问题讨论】:

    标签: java hibernate jpa hibernate-onetomany


    【解决方案1】:

    在单向映射中,我遇到了类似的问题,即在外键列中插入空值并得到运行时异常数据破坏异常。

    通过在 @JoinColumn 上添加 nullable=false 解决了问题

    @OnetoMany
    @JoinColumn(nullable=false) 
    

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

    【讨论】:

    • 这不是一个解决方案。您不应该为此更改数据库架构。必须有其他解决方案。
    【解决方案2】:

    由于这是一个双向关系,您需要确保插入每个实体都参考关系的另一端,因为您在产品详细信息中级联 vndf,您应该这样做

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

    【讨论】:

    • 我正在从我的 bean 类中获取并将其设置为模型类,如下所示VnfDetails v = new VnfDetails(); ProductDetails p = new ProductDetails(); Set&lt;VnfDetails&gt; vnfList = new HashSet&lt;VnfDetails&gt;(); 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);
    【解决方案3】:

    在 onetoManyClass 中定义 joinColumn,在 ProductDetails 中没有任何引用。

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

    【讨论】:

      【解决方案4】:
      @ManyToOne(fetch = FetchType.LAZY)
      @JoinColumn(name="PRODUCT_ID")
      private ProductDetails productDetails;
      

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

      【讨论】:

      • 不,这是不正确的,连接列的名称可以是任何东西
      猜你喜欢
      • 2015-07-27
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多