2014-02-26 74 views
0

我收到的時候我試圖創建一個一對多的關聯休眠:一對多協會不工作未知實體錯誤

這裏了以下錯誤在哪裏創建關聯的代碼運行

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未設置。

+0

嘗試與CascadeType.ALL –

回答

1

就我所知,使用save(..)方法不可能保留對象的集合。試試以下代碼:

public void assignDoctorSpecialty(Doctor doctor, Specialty specialty) { 

    [...] 

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

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

如果我改變'session.save(醫生);'''session.save(醫生);'沒有錯誤。然而,當我進入我的數據庫'Doctor'表中的'specialty_id'是空的。我看到的每一個關於一對多關係的例子都保存了'many',以便保存'one'。 – user2158382

+0

添加'@ Cascade' hibernate註釋並啓用'CascadeType.SAVE_UPDATE'。 – trylimits

-1

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

+0

這可能已經解決了你,但我認爲這確實是因爲你試圖堅持一個列表而不是它的單個實體。 – Amalgovinus