更新具有唯一约束的表条目 - Hibernate

时间:2011-11-22 08:11:06

标签: hibernate save unique cascade

我是Hibernate的新手并且遇到以下情况:

A类

课程延伸A (课程名称是唯一的)

班级学生(持有一套课程)

我的目标是为了能够将新学生添加到参加现有课程的数据库中。我甚至不需要更新现有课程,但不想让保存操作失败。

我正在使用session saveOrUpdate(cascade = ALL),而所有saveOrUpdates都在flush之前发生 - 一切正常。 当我重新运行我的主要时,我收到一个错误:

SQL错误:1062,SQLState:23000

关键“COURSE_NAME”

重复输入“历史记录”

Bellow是代码的片段。 任何帮助表示感谢。

A类:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="TYPE")
@Table(name="A")
public class A
{
    private long aId;

    private String info;

    public A(String info)
    {
        this.info = info;
    }

    @Id
    @GeneratedValue
    @Column(name="A_ID")
    public long getAId()
    {
        return aId;
    }

    public void setAId(long aId)
    {
        this.aId = aId;
    }

    //@Column(name="INFO", nullable=false, insertable=false, updatable=false)
    @Column(name="INFO")
    public String getInfo()
    {
        return info;
    }

    public void setInfo(String info)
    {
        this.info = info;
    }
}

课程:

@Entity
@DiscriminatorValue("COURSE")
@Table(name="COURSE", uniqueConstraints = {@UniqueConstraint(columnNames={"COURSE_NAME"})})
public class Course extends A{

    private String courseName;

    public Course() {
        super("initial");
    }

    public Course(String courseName, String info) 
    {
        super(info);
        this.courseName = courseName;
    }

    @Column(name="COURSE_NAME")
    public String getCourseName() {
        return this.courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

}

学生 持有Coreses列表

@Entity
@Table(name = "STUDENT")
public class Student
{

    private long        studentId;

    private String      studentName;
    private String      additionalInfo;

    private Set<Course> courses = new HashSet<Course>(0);

    @Column(name = "ADDITIONAL_INFO")
    public String getAdditionalInfo()
    {
        return additionalInfo;
    }

    public void setAdditionalInfo(String additionalInfo)...

    public Student()
    {
    }

    public Student(String studentName, String info, Set<Course> courses)
    {
        this.studentName = studentName;
        this.courses = courses;
        this.additionalInfo = info;
    }

    @Id
    @GeneratedValue
    @Column(name = "STUDENT_ID", unique=true)
    public long getStudentId()
    {
        return this.studentId;
    }

    public void setStudentId(long studentId)...

    @Column(name = "STUDENT_NAME", nullable = false, length = 100)
    public String getStudentName()
    {
        return this.studentName;
    }

    public void setStudentName(String studentName)...

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "aId")
    public Set<Course> getCourses()
    {
        return this.courses;
    }

    public void setCourses(Set<Course> courses)
    {
        this.courses = courses;
    }
}

1 个答案:

答案 0 :(得分:1)

在没有看到代码的情况下,它无法准确地说出来。但是,我怀疑您正在创建一个课程名称为“History”的新对象,并将其添加到新的学生对象中。你应该做的是从数据库中获取courseName =“History”的课程对象,然后在新的学生对象中设置它。

相关问题