当前位置: 首页 > 知识库问答 >
问题:

jpa Entity-getter没有带来正确的结果

有骏奇
2023-03-14

我正在使用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;
}

共有1个答案

逄岳
2023-03-14

问题解决了...
我发现这一切都发生了,因为我有一个用于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