【问题标题】:Hibernate: OneToMany Association not working Unknown entity error休眠:OneToMany 关联不起作用未知实体错误
【发布时间】:2014-02-26 07:10:03
【问题描述】:

我在尝试创建一对多关联时遇到以下错误

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 对象,而不是尝试通过级联保存Specialty 医生列表来间接保存它,它不会引发错误。但是,当我进入我的数据库时,Doctor 表中的specialty_id 没有设置。

【问题讨论】:

  • 试试 CascadeType.ALL

标签: java eclipse hibernate jpa


【解决方案1】:

据我所知,不可能使用save(..) 方法来持久化对象集合。试试下面的代码:

public void assignDoctorSpecialty(Doctor doctor, Specialty specialty) {

    [...]

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

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

【讨论】:

  • 如果我将session.save(doctors); 更改为session.save(doctor); 没有错误。但是,当我进入我的数据库 specialty_id 时,Doctor 表是空的。我看到的每个一对多关系示例都保存many,以便保存one
  • 添加@Cascade hibernate注解并启用CascadeType.SAVE_UPDATE
【解决方案2】:

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

【讨论】:

  • 这可能已经为您解决了问题,但我认为这确实是因为您试图保留一个列表而不是其单个实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多