Обновить запись таблицы с уникальными ограничениями - Hibernate - PullRequest
0 голосов
/ 22 ноября 2011

Я новичок в Hibernate и имею следующую ситуацию:

класс А

курс курса продлевает A (название курса уникально)

ученики класса (проводит набор курсов)

Моя цель - иметь возможность добавлять новых студентов в базу данных, которые посещают существующие курсы. Мне даже не нужно обновлять существующий курс, но я не хочу проваливать операцию сохранения.

Я использую сеанс saveOrUpdate (cascade = ALL), и хотя все saveOrUpdates происходят до сброса - все в порядке. при повторном запуске основного я получаю сообщение об ошибке:

Ошибка SQL: 1062, SQLState: 23000

Повторяющаяся запись «История» для ключа «COURSE_NAME»

Ниже приведен фрагмент кода. любая помощь приветствуется.

класс 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;
    }

}

И класс Ученик , который содержит список ядер :

@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 Ответ

1 голос
/ 22 ноября 2011

Невозможно сказать, не видя код.Однако я подозреваю, что вы создаете новый объект с именем курса «История» и добавляете его в новый объект учащегося.Что вам нужно сделать, это извлечь объект курса с courseName = "History" из базы данных и затем установить его в новом объекте студента.

...