簡體   English   中英

休眠:OneToMany關聯不起作用未知實體錯誤

[英]Hibernate: OneToMany Association not working Unknown entity error

嘗試創建一對多關聯時出現以下錯誤

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 Doctor列表間接保存它,則不會引發任何錯誤。 然而,當我進入我的數據庫, specialty_id了的Doctor表未設置。

據我所知,不可能使用save(..)方法持久save(..)對象集合。 嘗試以下代碼:

public void assignDoctorSpecialty(Doctor doctor, Specialty specialty) {

    [...]

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

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

我想出了答案。 發生這種情況的原因是因為我嘗試save一個已經保存在數據庫中的對象。 我要做的就是用session.save(doctor)替換session.saveOrUpdate(doctor)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM