首页 > 解决方案 > 使用 Set 数据结构管理 JPA 实体 - 使用 add 方法

问题描述

我看到了 HashSet 在实体中使用的示例,并且被视为其他数据类型。但我希望使用“添加”而不是设置整个对象

package com.baeldung.manytomany.model;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "student")
public class Student {

    @Id
    @Column(name = "id")
    private Long id;

    @ManyToMany
    @JoinTable(name = "course_like", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id"))
    private Set<Course> likedCourses = new HashSet<>();

    @OneToMany(mappedBy = "student")
    private Set<CourseRating> ratings = new HashSet<>();

    @OneToMany(mappedBy = "student")
    private Set<CourseRegistration> registrations = new HashSet<>();

    // additional properties

    public Student() {
    }

    public Student(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Set<Course> getLikedCourses() {
        return likedCourses;
    }

    public void setLikedCourses(Set<Course> likedCourses) {
        this.likedCourses = likedCourses;
    }

    public Set<CourseRating> getRatings() {
        return ratings;
    }

    public void setRatings(Set<CourseRating> ratings) {
        this.ratings = ratings;
    }

    public Set<CourseRegistration> getRegistrations() {
        return registrations;
    }

    public void setRegistrations(Set<CourseRegistration> registrations) {
        this.registrations = registrations;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.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;
        Student other = (Student) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}

有没有比这更好的方法

public Set<CourseRating> getRatings() {
    return ratings;
}

public void setRatings(Set<CourseRating> ratings) {
    this.ratings = ratings;
}

我确实尝试过

public void addRatings(CourseRating rating) { this.ratings.add(rating); }

但对象没有持久化。我认为学生的储蓄应该照顾储蓄评级。我错过了什么?

标签: spring-bootjpajpa-2.0

解决方案


好的排序(1)

     public void addRatings(CourseRating rating) {
     this.ratings.add(rating); rating.setBlah(this); 
 }

(2) 更新实体:

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "exam", orphanRemoval = true)
    @OrderBy("id")
private Set<CourseRating> ratings = new HashSet<>();

正在使用 Embeddable,所以出现错误 - 为:class 生成空 id ...所以从可用对象设置 id

ratings.setId(new ThatKey(some1, some2));

推荐阅读