实体的JPA集合字段是可修改的

时间:2013-12-18 07:52:33

标签: java jpa ejb entitymanager managed-bean

我有一个JPA实体,其定义如下:

@Entity
@Table(name = "JPA_TEACHER")
public class Teacher implements ITeacher{
    @Id
    private String id;

    @Column(name = "NAME")
    private String name;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @JoinColumn(name="TEACHER_ID", referencedColumnName="ID")
    private List<Student> students;

    public Teacher() {
        super();
    }

    public Teacher(String name) {
        super();
        this.name = name;
    }

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public void addStudents(Student student) {
        if(this.students == null){
            this.students = new ArrayList<Student>();
        }
        this.students.add(student);
    }
}
  1. 我在EJB上下文中获得了一个带有实体管理器的命名查询的教师列表。
  2. 然后我用结果列表创建一个新的ArrayList,因为JPA返回的结果列表是只读的。
  3. 我尝试将学生添加到学生领域为空的一些教师的学生领域。然后我得到一个NullPointException,无论我是否尝试在该字段为null时将新ArrayList分配给该字段。似乎学生领域是可修改的。但是name等其他字段是可修改的。
  4. 我用谷歌搜索但没有发现任何东西。希望有人对此有所了解。 非常感谢。

2 个答案:

答案 0 :(得分:1)

从一个stundent处移除S以添加他。

this.students.add(学生);

答案 1 :(得分:1)

除了Big Bad Baerni的回复,请确保您的学生拥有指定的教师属性,因为学生是此处关系的所有者。

public void addStudents(Student student) {
    if(this.students == null){
        this.students = new ArrayList<Student>();
    }
    student.setTeacher(this)
    this.students.add(student);
}

请参阅In a bidirectional JPA OneToMany/ManyToOne association, what is meant by "the inverse side of the association"?

我不知道你的域名,但恕我直言,这里应该有很多ToMany关系