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<>();