Java 冬眠:@manytone,@OneToMany在结果中给出空值
我有java应用程序(Spring+Hibernate)和mySql数据库。Java 冬眠:@manytone,@OneToMany在结果中给出空值,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我有java应用程序(Spring+Hibernate)和mySql数据库。 弹簧:5.0.2 冬眠:5.2.12 有两个实体:学生和课程。它们是相关的:一个学生上多节课(课表中的外键)。 代码: @实体 @表(name=“学生”) @XmlRootElement 公共类学生实现可序列化{ 私有静态最终长serialVersionUID=1L; @身份证 @基本(可选=假) @列(name=“student\u id”) 私人字符串学生ID; @OneToMany(cascade=Cascade
弹簧:5.0.2
冬眠:5.2.12 有两个实体:学生和课程。它们是相关的:一个学生上多节课(课表中的外键)。
代码:
@实体
@表(name=“学生”)
@XmlRootElement
公共类学生实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@基本(可选=假)
@列(name=“student\u id”)
私人字符串学生ID;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“studentId”)
私人藏书;lessonCollection;
// ......
}
及
@实体
@表(name=“课程”)
@XmlRootElement
公共类课程实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@基本(可选=假)
@列(name=“lesson\u id”)
私有字符串lessonId;
@JoinColumn(name=“学生id”,referencedColumnName=“学生id”)
@多通(可选=假)
私立学生;
@基本(可选=假)
@列(name=“number”)
私有整数;
// ......
}
在DB中,填写学生和课程的所有字段
我可以成功地选择所有符合API标准的学生。
但当我选择课程(一个/所有)时,我有一个休眠异常:org.hibernate.Property.AccessException:为org.Lesson.number的基元类型setter的属性[class org.Lesson.number]分配了空值。 如果我将字段“number”更改为整数(可为null),则会得到这样的结果:
[null,null,null]
使用HQL发出请求会得到相同的结果 有人能给出建议吗?实体及其关系有什么问题?
先走一步 UPD:
获取结果的代码:
public List<E> getAll() throws SQLException {
CriteriaBuilder builder = curSession().getCriteriaBuilder();
CriteriaQuery<? extends E> criteriaQuery = builder.createQuery(daoType);
criteriaQuery.from(daoType);
Query query = curSession().createQuery(criteriaQuery);
try {
System.out.println(query.getResultList());
} catch (Throwable e) {
throw new SQLException(e.getMessage()); // that's where it's fire
}
}
public List getAll()引发SQLException{
CriteriaBuilder=curSession().getCriteriaBuilder();
CriteriaQuery默认情况下,@OneToMany
FetchType
是Lazy
。因此不会加载它。请按如下所示更改映射。注意:FetchType
指定为Eager
@OneToMany(cascade = CascadeType.ALL, mappedBy = "studentId",fetch=FetchType.LAZY)
private Collection<Lesson> lessonCollection;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“studentId”,fetch=FetchType.LAZY)
私人藏书;lessonCollection;
getLessonCollection
将返回代理对象,该代理对象将具有实际对象的加载数据。默认情况下@OneToMany
FetchType
是Lazy
。因此它不会被加载。请按如下所示更改映射。注意:FetchType
被指定为Eager
@OneToMany(cascade = CascadeType.ALL, mappedBy = "studentId",fetch=FetchType.LAZY)
private Collection<Lesson> lessonCollection;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“studentId”,fetch=FetchType.LAZY)
私人藏书;lessonCollection;
getLessonCollection
将返回代理对象,该代理对象将包含实际对象的加载数据。发布您的代码,包括显示结果的语句。准确地告诉您预期的结果以及实际结果。此外,请将studentId
重命名为student
。它是studen,而不是student一个学生ID。已经更新了post,包括显示结果的语句。准确地告诉你期望的结果是什么,以及它实际上是什么。不要捕获Throwable。让异常传播,如果你有异常,发布它的堆栈跟踪。已经更新的post我想你已经知道如何修复这个异常:一个p基本整数不可能包含null,因此,如果列可为null,则类型应为整数。如果此列中不应存在null,则应向列添加not null约束,以使其不可能存在,并且应修复数据。发布代码,包括显示结果的语句。准确地告诉您不希望结果是什么,它实际上是什么。另外,请将studentId
重命名为student
。这是一个studen,而不是一个student ID。已经更新了帖子,包括显示结果的语句。准确地告诉您希望结果是什么,以及它实际上是什么。不要捕获Throwable。让异常传播,如果您有异常,请发布其堆栈跟踪。已更新的post我认为您已经知道如何修复此异常:原始整数不可能包含null,因此如果列可为null,则类型应为整数。如果此列中不应存在null,则应向co添加not null约束为了使这不可能,数据应该是固定的。Big thanx。但是……你写了:“注意:FetchType被指定为渴望。”在你的代码片段中是“fetch=FetchType.LAZY”。真的在哪里?哦,对不起。FetchType.Earge
我是指Big thanx。但是……你写了:“注意:FetchType被指定为渴望。”在你的代码片段中是“fetch=FetchType.LAZY”。真实情况在哪里?哦,对不起..FetchType.Eager
我是说
@OneToMany(cascade = CascadeType.ALL, mappedBy = "studentId",fetch=FetchType.LAZY)
private Collection<Lesson> lessonCollection;