【问题标题】:JPA collection field of an entity is modifiable实体的 JPA 集合字段是可修改的
【发布时间】:2013-12-18 07:52:33
【问题描述】:

我有一个 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,无论我是否尝试在该字段为空时为其分配一个新的ArrayList。似乎学生领域是可修改的。但是name等其他字段是可以修改的。

我用谷歌搜索过,但一无所获。希望有人对此有所了解。 非常感谢。

【问题讨论】:

  • 每个字段都可以修改,学生列表也是如此。由于其他原因,您会收到 NullPointerException。

标签: java jpa ejb entitymanager managed-bean


【解决方案1】:

从一名学生身上删除末尾的 S 以添加他。

this.students.add(student);

【讨论】:

  • 哦,非常抱歉。由于我的粗心,这是我的错,但不是这个问题的答案。谢谢:-) 顺便说一句,我已经纠正了拼写错误。
【解决方案2】:

除了 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"?

我不知道你的域,但恕我直言,这里应该有一个多对多关系

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 2011-09-25
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多