Hibernate:OneToMany Association无法正常工作未知实体错误

时间:2014-02-26 07:10:04

标签: java eclipse hibernate jpa

当我尝试创建一对多关联时,我收到以下错误

Exception in thread "main" org.hibernate.MappingException: Unknown entity: org.hibernate.collection.internal.PersistentBag

这是创建关联的代码运行的地方

public void assignDoctorSpecialty(Doctor doctor, Specialty specialty) {
    Session session = sessionFactory.openSession();
    session.beginTransaction();

    doctor.setSpecialty(specialty);

    List<Doctor> doctors = specialty.getDoctors();
    doctors.add(doctor);

    session.save(doctors);
    session.getTransaction().commit();
    session.close();

}

这是我的医生

package edu.cs157b.hibernate;

import java.util.ArrayList;

import javax.persistence.*;

@Entity
@Table(name="DOCTOR_INFO")
@NamedQueries (
    {
        @NamedQuery(name = "Doctor.getAll", query = "from Doctor"),
        @NamedQuery(name = "Doctor.findByName", query = "from Doctor where name = :name")
    }
)
public class Doctor implements Person {

    private int id;
    private String name;
    private Specialty specialty; 

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

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

    @Column(unique=true)
    public String getName() {
        return name;
    }

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

    @ManyToOne (fetch = FetchType.EAGER, cascade= CascadeType.PERSIST) 
    @JoinColumn(name="specialty_id") 
    public Specialty getSpecialty() {
        return specialty;
    }

    public void setSpecialty(Specialty specialty) {
        this.specialty = specialty;
    }
}

这是我的专业

package edu.cs157b.hibernate;

import java.util.ArrayList;

import javax.persistence.*;

import java.util.List;

@Entity
@Table(name="SPECIALTY_INFO")
@NamedQueries (
    {
        @NamedQuery(name = "Specialty.getAll", query = "from Specialty"),
        @NamedQuery(name = "Specialty.findByName", query = "from Specialty where name = :name")
    }
)
public class Specialty {
    private List<Doctor> doctors = new ArrayList<Doctor>();

    private int id;
    private String name;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    @Column(unique=true)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(mappedBy="specialty", targetEntity = Doctor.class, 
             fetch=FetchType.LAZY, cascade= CascadeType.PERSIST) 
    public List<Doctor> getDoctors() {
        return doctors;
    }
    public void setDoctors(List<Doctor> doctors) {
        this.doctors = doctors;
    }    

}

修改

如果我直接保存Doctor对象,而不是试图通过Cascade保存Specialty医生列表来间接保存它,它不会抛出任何错误。但是,当我进入我的数据库时,specialty_id表的Doctor未设置。

2 个答案:

答案 0 :(得分:1)

据我所知,无法使用save(..)方法保留对象集合。请尝试以下代码:

public void assignDoctorSpecialty(Doctor doctor, Specialty specialty) {

    [...]

    for (Doctor d : doctors) {
         session.save(d);
    }

    session.getTransaction().commit();
    session.close();
}

答案 1 :(得分:-1)

我想出了答案。发生这种情况的原因是因为我尝试save已经保存在数据库中的对象。我所要做的就是用session.save(doctor)替换session.saveOrUpdate(doctor)