2012-07-01 42 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