我正在使用Jpa和Hibernate。
我的项目中发生了一件非常奇怪的事情。
我有两个实体:学生和课程,多对多的关系。
很长一段时间内,一切都运行得很好,但突然我遇到了这个问题:
当我找到一个特定的学生(em.find)并使用getter(student.getcourses)返回其课程列表时,我只收到列表的一部分!如果我使用一个查询(“Select s.cources from Students s where id=...”)--它会给出正确的结果。
我试着解决了很长时间--什么也没有解决。
任何人都知道问题是什么?
任何帮助都将非常感谢!
以下是我的代码:
/**
*实体的实体实现类:course
*
*/
@Entity(名称=“cources”)
公开课课程扩展盖章{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String courseName;
@Version
@Column(name = "Version", nullable = false)
private Long version;
@ManyToMany(mappedBy = "courses",fetch = FetchType.LAZY)
private Set<Student> students = new HashSet<Student>();
@ManyToOne
@JoinColumn(name = "LecturerID")
private Lecturer lecturer;
public Course() {
super();
this.courseName = " ";
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Lecturer getLecturer() {
return lecturer;
}
public void setLecturer(Lecturer lecturer) {
this.lecturer = lecturer;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
}
private static final long serialVersionUID = 1L;
@Enumerated(EnumType.STRING)
@Column(length = 2)
private E_Year studentYear;
private Boolean inCondition;
@ManyToMany(cascade = PERSIST, fetch = FetchType.LAZY)
private Set<Course> courses = new HashSet<Course>();
public Student() {
super();
this.inCondition = true;
}
public E_Year getStudentYear() {
return studentYear;
}
public void setStudentYear(E_Year studentYear) {
this.studentYear = studentYear;
}
public Boolean getInCondition() {
return inCondition;
}
public void setInCondition(Boolean inCondition) {
this.inCondition = inCondition;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
private static final long serialVersionUID = 1L;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created", nullable = false)
private Date created;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated", nullable = false)
private Date updated;
private String lastUser;
public Date getCreated() {
return created;
}
public Date getUpdated() {
return updated;
}
public String getLastUser() {
return lastUser;
}
@PrePersist
protected void onCreate() {
updated = created = new Date();
lastUser = System.getProperty("user.name");
}
@PreUpdate
protected void onUpdate() {
updated = new Date();
lastUser = System.getProperty("user.name");
}
public Stamping() {
super();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((created == null) ? 0 : created.hashCode());
result = prime * result
+ ((lastUser == null) ? 0 : lastUser.hashCode());
result = prime * result + ((updated == null) ? 0 : updated.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Stamping other = (Stamping) obj;
if (created == null) {
if (other.created != null)
return false;
} else if (!created.equals(other.created))
return false;
if (lastUser == null) {
if (other.lastUser != null)
return false;
} else if (!lastUser.equals(other.lastUser))
return false;
if (updated == null) {
if (other.updated != null)
return false;
} else if (!updated.equals(other.updated))
return false;
return true;
}
问题解决了...
我发现这一切都发生了,因为我有一个用于student和course的基类,并且它有一个从Eclipse生成的HashCode和Equals方法。
删除这些方法后,一切都运行良好。
有人能解释为什么会发生吗?
谢谢。
我对正确的mvc模式有点困惑。 这是我的配置文件:在这个类中,我有所有的Beans。 这是我的接口UserRepo和接口UserService。它们是一样的 我的类实现了这个接口 最后,我在控制器I@Autowired UsersRepo/中安装了控制器,这是一个接口/。我的代码可以运行,我可以做所有的CRUD操作。 但是,有人告诉我,这不是正确的方式。我不能直接自动连线@在控制器类内部自动连接U
Minecraft 1.8.9 我已经成功地制作了一个只有一个纹理的块,并且它呈现得很好。我看了一些youtube教程,它起作用了。耶! 然而,我的问题是另一个块,它应该有多个纹理。它最初有一个像另一个块一样的纹理(只是为了练习我的块),但后来我决定它需要元数据和状态。为此,我遵循了本教程,直到它出现BlockRenderRegister.class。我没有制作这个类,它也没有详细说明放在哪里,所
问题内容: 包含Bool的NSNumber很容易与可以包装在NSNumber类中的其他类型混淆: 但是,保留了有关其原始类型的信息,如下所示: 问题是:哪种方法是确定Bool何时包装在NSNumber中而不是其他方法中的最佳(和/或最安全)方法?都一样有效吗?或者,还有其他更好的解决方案吗? 问题答案: 您可以对Objective-C提出相同的问题,这是Objective-C的答案-您可以从Swi
问题是: 下面是我的Java类,我认为它的代码可以解决问题9:
我可以在lombok中使用@JsonIgnore和@getter注释,而不显式定义getter,因为我必须在序列化对象时使用这个JsonIgnore,但是在反序列化时,JsonIgnore注释必须是ignore,所以对象中的字段不能为空。 我知道,只要在password的getter上定义JsonIgnore就可以防止我的密码被序列化,但为此我必须显式定义我不想要的getter。任何建议,任何帮助
为了解决这个问题,我尝试了许多JDK版本,但似乎无论我使用哪个java,结果总是一样的。 MavenReportException:创建存档时出错:无法找到javadoc命令:未正确设置环境变量JAVA_HOME。 我跑了: 导出JAVA_HOME=/usr/lib/jvm/JAVA-8-openjdk-amd64 : MavenReportException:创建存档时出错:无法找到javado