2016-10-15 2 views
0

У меня есть два объекта для двух таблиц. У ученика есть отношения «один-много» с «MonthAttendance». student_id - это соединительная группа. Посмотрите на приведенный ниже код.Hibernate Двунаправленное сопоставление не работает

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

    @Id 
    @Column(name="student_id") 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private String studentId; 
/* 
*More codes 
*/ 

    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL) 
    private Set<MonthAttendance> monthAttendances; 
/* 
*mutators 
*getter and setter methods 
*/ 

} 


@Entity 
@Table(name="month_attendance") 
public class MonthAttendance implements Serializable { 

    @Id 
    @Column(name="month_year_id") 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private String monthYearId; 
/* 
*More codes 
*/ 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "student_id") 
    private Student student; 
/* 
*mutators 
*getter and setter methods 
*/ 
} 

У меня есть класс DAO, чтобы получить данные о студентах из базы данных. Я использовал ниже код для извлечения данных,

List<Student> studentList = session.createQuery("from Student").list(); 
List<Student> studentList = session.createQuery("from MonthAttendance").list(); 

Оба работают нормально. Но объект имеет рекурсивную структуру, такую ​​как Student имеет MonthAttendance, MonthAttendance имеет Student, снова у Student есть MonthAttendance и продолжается. есть ли способ решить это? Мне просто нужно, чтобы у студента был MonthAttendance, у которого нет ученика, если я пытаюсь получить Student. Заранее спасибо.

ответ

0

Для того, чтобы избавиться от этого рекурсивного поведения просто удалить:

cascade = CascadeType.ALL 

от Студенческого субъекта, например:

@OneToMany(mappedBy = "student") 
private Set<MonthAttendance> monthAttendances; 

Cascade в основном говорит это:

Если я выполняю действие над сущностью, как я должен действовать в отношении связанного объекта.

Должен ли я выполнить то же действие на нем?

Давайте возьмем ваш пример:

Если я буду стараться, чтобы сохранить/сохраняться в MonthAttendance объект, Hibernate будет пытаться сделать сохранить/упорствовать операцию на Student объекта, связанного с ним, а также. Зачем?

Поскольку на MonthAttendance лица под Student ассоциации, мы имеем CascadeType.ALL (под CascadeType.ALL мы имеем 4 до 5 вида действий), что означает, когда вы пытаетесь сохранить/упорствовать MonthAttendance Hibernate пытаются сделать то же самое действие (сохранить/сохраниться в нашем случае) на прикрепленном объекте Student.

Это объясняет, почему вы получите рекурсивное поведение, потому что вы отметили обе стороны ассоциации с:

cascade = CascadeType.ALL 

При сохранении первого лица он пытается сохранить второй, а вторая попытка сохранить сначала снова и так далее.

+0

Спасибо за ответ. Удалено «cascade = CascadeType.ALL» из студенческого объекта. Но по-прежнему сталкивается с той же проблемой –

+0

Можете ли вы опубликовать свою трассировку стека за исключением? –

+0

Я не получаю исключения. Ученик имеет набор MonthAttendance, MonthAttendance имеет объекты Student при извлечении данных. Так я получаю ниже исключение, при преобразовании моего результата в JSON, –

Смежные вопросы