2012-07-01 91 views
0

我有2個實體班叫做學生和大學,學生和大學的關係是多對一,這意味着許多學生可以在一所大學學習。我的輸入jsp頁面基本上會要求大學名稱和學生的電子郵件地址進行註冊。休眠多對一 - 獲取重複輸入例外

這是流程。我在輸入頁面輸入以下內容 -

university1,student1 - 這將在我的數據庫中添加university1和student1。

當我進入 -

university1,STUDENT2 - 在這裏我的目的是先找到university1是否已存在於我的數據庫。如果是,則將同一所大學關聯到學生對象並嘗試保存它。但是,當我這樣做,Hibernate是試圖在數據庫中添加一個更多的大學對象,我得到以下異常 -

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'university_id'. 

這裏是我的實體類 -

@Entity 
@Table(name="students") 
public class Student implements Serializable{ 

private Integer studentId; 
private University university; 


@Id 
@GeneratedValue 
@Column(name = "student_id") 
public Integer getStudentId() { 
    return studentId; 
} 

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "university_id") 
public University getUniversity() { 
    return university; 
} 

} 

@Entity 
@Table(name="university") 
public class University implements Serializable { 

private Integer universityId; 

@Id 
@GeneratedValue 
@Column(name = "university_id") 
public Integer getUniversityId() { 
    return university; 
} 

public void setCompanyId(Integer companyId) { 
    this.companyId = companyId; 
} 

@Column(name = "university_name", unique = true, nullable = false) 
public String getUniversityName() { 
    return university; 
} 

} 

下面是簡單的Java碼。

University university = universityService.getUniversityByName(student.getUniversity().getUniversityName()); 
if(university != null) { 
student.setUniversity(university); 
} 
getHibernateTemplate().saveOrUpdate(student); 

我正在使用Spring MVC和數據庫模式是由Hibernate生成的。看起來我正在犯一些非常基本的錯誤。

+0

不要打擾,我自己找到解決方案。 university_name屬性不應具有「唯一」屬性。我刪除它,現在一切工作正常。 – user977263

+1

我懷疑這是解決方案。現在你可能創建了幾個同名的大學,但沒有注意到它。每個學生可能都有自己的大學。獨特的限制是一件好事:它阻止了兩所大學擁有相同的名稱。 –

+0

那麼,解決方案是什麼? – user977263

回答

0

hibernate不會發出查詢來確定數據庫中是否已有其他具有相同唯一列值的記錄,您必須自己動手。

List<University> unis = session.createCriteria(University.class) 
    .add(<Restrictions.eq("name", name) 
    .list<University>() 

University u; 
if (unis.getCount() == 0) 
{ 
    u = new University(); 
    ... 
} 
else 
{ 
    u = unis.get(0); 
} 
+0

但我已經在我的java代碼中這樣做了。 universityService.getUniversityByName()API將按大學名稱查找大學,然後在學生退出時將其分配給學生。所以你的建議已經被處理了。 – user977263

+0

然後你使用不同的會話來搜索uni並保存新學生? – Firo

+0

不,爲什麼我不應該使用不同的會話? – user977263