Hibernate 休眠一对多级联保存空指针异常

Hibernate 休眠一对多级联保存空指针异常,hibernate,nullpointerexception,save,one-to-many,cascade,Hibernate,Nullpointerexception,Save,One To Many,Cascade,我有一对多的关系,如下面两节课所述 @Entity @Table(name="version_mst") public class Version { private Long id; private String versionName; private String releaseName; private Set<VersionReleaseComponents> versionReleaseComponents;

我有一对多的关系,如下面两节课所述

    @Entity
    @Table(name="version_mst")
    public class Version {

    private Long   id;
    private String versionName;
    private String releaseName;
    private Set<VersionReleaseComponents> versionReleaseComponents; 

    @Id
    @GeneratedValue
    @Column(name="id")
    public Long  getId() {
        return id;
    }
    public void setId(Long  id) {
        this.id = id;
    }

    @Column(name="versionName")
    public String getVersionName() {
        return versionName;
    }
    public void setVersionName(String versionName) {
        this.versionName = versionName;
    }

    @Column(name="releaseName")
    public String getReleaseName() {
        return releaseName;
    }
    public void setReleaseName(String releaseName) {
        this.releaseName = releaseName;
    }

    @OneToMany(mappedBy="version",cascade = { javax.persistence.CascadeType.ALL },fetch = FetchType.EAGER,targetEntity=VersionReleaseComponents.class)
    public Set<VersionReleaseComponents> getVersionReleaseComponents() {
        return versionReleaseComponents;
    }
    public void setVersionReleaseComponents(
            Set<VersionReleaseComponents> versionReleaseComponents) {
        this.versionReleaseComponents = versionReleaseComponents;
    }

      }       
当我尝试执行以下命令时

        Version v = new Version();
        v.setReleaseName("RN1");
        v.setVersionName("VName1");

        VersionReleaseComponents vrc = new VersionReleaseComponents();
        vrc.setComponentName("cn1");
        vrc.setVersionNumber("VNum1");
        vrc.setVersion(v);

        v.getVersionReleaseComponents().add(vrc); // null pointer error on here
        session.saveOrUpdate(v);
获取集合时出现空指针异常。请指导我

创建查询如下所示

      CREATE TABLE `version_mst` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `versionName` varchar(20) NOT NULL,
      `releaseName` varchar(20) NOT NULL,
      `last_modified_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`ID`),
      UNIQUE KEY `VERSION_MAPPING_MST_UNIQUE` (`versionName`,`releaseName`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    CREATE TABLE `version_release_components` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `versionId` int(10) NOT NULL ,
      `componentName` varchar(20) NOT NULL,
      `versionNumber` varchar(20) NOT NULL,
      `last_modified_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`ID`),
      CONSTRAINT `FK_VERSION` FOREIGN KEY (`versionId`) REFERENCES `version_mst` (`id`),
      UNIQUE KEY `VERSION_RELEASE_UNIQUE` (`componentName`,`versionNumber`)
    ) ENGINE=InnoDB   DEFAULT CHARSET=latin1;

Version
中,您尚未实例化:

private Set<VersionReleaseComponents> versionReleaseComponents; 
或者您需要的任何
设置

尝试替换

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="versionId", referencedColumnName="id", insertable = false, updatable = false)
public Version getVersion() {
  return version;
}
为此:

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="versionReleaseComponents")
   public Version getVersion() {
      return version;
    }
并使用@user1393563的建议:

private Set<VersionReleaseComponents> versionReleaseComponents = new HashSet<VersionReleaseComponents>();
private Set versionReleaseComponents=new HashSet();
关于。

更改了以下内容: 已删除VersionReleaseComponents中的声明

     @Column(name = "versionId")
    private Long versionId;
    public Long getVersionId() {
        return versionId;
    }
    public void setVersionId(Long versionId) {
        this.versionId = versionId;
    }
已将VersionReleaseComponents声明更改为

 @JoinColumn(name="versionId")
并且版本声明是

@OneToMany(mappedBy="id",cascade = { javax.persistence.CascadeType.ALL },fetch =  FetchType.LAZY)
上述改变奏效了。
由于其他原因,我已更改为FetchType.LAZY,但它不是解决方案的一部分。

我认为您正在尝试向集合添加一个为NULL的项

试试这个:

    Version v = new Version();
    v.setReleaseName("RN1");
    v.setVersionName("VName1");

    VersionReleaseComponents vrc = new VersionReleaseComponents();
    vrc.setComponentName("cn1");
    vrc.setVersionNumber("VNum1");
    vrc.setVersion(v);

    Set<VersionReleaseComponents> vrcs = new HashSet<VersionReleaseComponents>();
    vrcs.add(vrc);
    v.setVersionReleaseComponents(vrcs);

    session.saveOrUpdate(v);
Version v=新版本();
v、 setReleaseName(“RN1”);
v、 setVersionName(“VName1”);
VersionReleaseComponents vrc=新版本ReleaseComponents();
vrc.setComponentName(“cn1”);
vrc.setVersionNumber(“VNum1”);
vrc.setVersion(v);
Set vrcs=new HashSet();
添加(vrc);
v、 setVersionReleaseComponents(VRC);
会话.保存或更新(v);

很可能是因为您尚未初始化
集合
变量。在构造函数或字段声明中初始化它

当我运行您的代码时,我得到了相同的异常,然后在我将变量初始化为:

private Set<VersionReleaseComponents> versionReleaseComponents = new HashSet<>();
private Set versionReleaseComponents=new HashSet();

那么在哪里创建新实例呢?如vrc.setVersion(v);Set vset=newhashset();vset.add(vrc);v、 setVersionReleaseComponents(vset)@user1393563请参见编辑响应。如果这回答了您的问题:请投票并接受答案…在尝试我的上述评论时,我得到org.hibernate.exception.ConstraintViolationException:无法在org.hibernate.exception.sqlstatecoverter.convert(sqlstatecoverter.java:94)插入:[com.abc.dm.dao.entities.VersionReleaseComponents]在org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66)@user1393563,我认为这是由inserable=false使insertable=true引起的,Updateable=true给出连接到数据库org.hibernate.MappingException:实体映射中的重复列:com.abc.dm.dao.entities.VersionReleaseComponents列:versionId(应使用insert=“false”update=“false”进行映射)我得到,org.hibernate.exception.sqlgrammareException:无法插入:org.hibernate.exception.jdbceptionhelper.convert(sqlstatecoverter.java:90)org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66)替换@OneToMany(mappedBy=“version”…对于此:@OneToMany(mappedBy=“id”)。更改为@manytone(fetch=FetchType.EAGER)@JoinColumn(name=“versionReleaseComponents”,referencedColumnName=“id”)和@OneToMany(mappedBy=“id”,cascade={javax.persistence.CascadeType.ALL},fetch=FetchType.EAGER,targetEntity=versionReleaseComponents.class)获取错误org.hibernate.exception.sqlgrammareException:无法插入:[com.abc.dm.dao.entities.versionReleaseComponents]在org.hibernate.exception.sqlstatecoverter.convert(sqlstatecoverter.java:90)和org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66)中,您可以看到本教程:。修复此问题:@JoinColumn(name=“versionReleaseComponents”)和@OneToMany(mappedBy=“id”)。如果运行,请在添加属性之前。
    Version v = new Version();
    v.setReleaseName("RN1");
    v.setVersionName("VName1");

    VersionReleaseComponents vrc = new VersionReleaseComponents();
    vrc.setComponentName("cn1");
    vrc.setVersionNumber("VNum1");
    vrc.setVersion(v);

    Set<VersionReleaseComponents> vrcs = new HashSet<VersionReleaseComponents>();
    vrcs.add(vrc);
    v.setVersionReleaseComponents(vrcs);

    session.saveOrUpdate(v);
private Set<VersionReleaseComponents> versionReleaseComponents = new HashSet<>();