Hibernate ManyToOne и OneToMany в одном объекте - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть 3 таблицы University (id, name), Group (id, name, university_id), Student (id, name, number, group_id).В одном университете много групп, а в одной группе много студентов.

Мои POJO выглядят так:

@Entity(name = "Student")
public class Student {
    @SequenceGenerator(name = "genStudent",sequenceName = "STUDENTSEQ")
    @Id
    @GeneratedValue(generator = "genStudent")
    private int id;
    @Column(name = "name")
    private String name;
    @Column(name = "facNum")
    private String facNum;
    @ManyToOne
    private UniGroup group;

    public UniGroup getGroup() {
        return group;
    }

    public void setGroup(UniGroup group) {
        this.group = group;
    }

    public Student(){
    }
... getters and setters
}

@Entity
public class UniGroup {
    @SequenceGenerator(name = "genGroup",sequenceName = "UNIGROUPSEQ")
    @Id
    @GeneratedValue(generator = "genGroup")
    private int id;
    @Column(name = "administrativeName")
    private String administrativeName;
    @OneToMany(mappedBy = "group",cascade=CascadeType.ALL)
    private List<Student> students;
    @ManyToOne
    private University university;
... getters and setters
}

@Entity
public class University {
    @SequenceGenerator(name = "genUniversity",sequenceName = "UNIVERSITYSEQ")
    @Id
    @GeneratedValue(generator = "genUniversity")
    private int id;
    @Column(name = "name")
    private String name;
    @OneToMany(mappedBy = "university",cascade=CascadeType.ALL)
    private List<UniGroup> groups;

    public University(){
        groups = new ArrayList<UniGroup>();
    }

Мой класс помощников:

public class StudentSystemUtil {
    private SessionFactory sessFac;

    public StudentSystemUtil(){
        sessFac = new Configuration().configure().buildSessionFactory();
    }

    @SuppressWarnings("unchecked")
    public void showGroups(){
        Session session = sessFac.getCurrentSession();

        try{
        session.beginTransaction(); 

        Query q = session.createQuery("from UniGroup");

        List<UniGroup> groups = (List<UniGroup>)q.list();

        for(UniGroup g:groups){
            System.out.println("Group: "+g.getId()+" "+g.getAdministrativeName());
            for(Student s:g.getStudents()){
                System.out.println(s.getName()+" "+s.getGroup().getAdministrativeName());
            }
        }
        session.getTransaction().commit();
        }catch(Exception e){
            System.out.println("Error: "+e.getMessage());
        }
    }

    public void saveGroup(UniGroup group){
        Session session = sessFac.getCurrentSession();
        try{
        session.beginTransaction();

        session.save(group);

        session.getTransaction().commit();
        }catch(Exception e){
            if(session.getTransaction() != null){
                session.getTransaction().rollback();
            }
            System.out.println("Error: "+e.getMessage());
        }
    }

    @SuppressWarnings("unchecked")
    public void showUniversityes(){
        Session session = sessFac.getCurrentSession();

        try{
        session.beginTransaction(); 

        Query q = session.createQuery("from University");

        List<University> universityes = (List<University>)q.list();

        for(University u:universityes){
            System.out.println("University: "+u.getId()+" "+u.getName());
            for(UniGroup g:u.getGroups()){
                System.out.println(g.getAdministrativeName());
                for(Student s:g.getStudents()){
                    System.out.println("Student "+s.getName());
                }
            }
        }
        session.getTransaction().commit();
        }catch(Exception e){
            System.out.println("Error: "+e.getMessage());
        }
    }

    public void saveUniversity(University uni){
        Session session = sessFac.getCurrentSession();
        try{
        session.beginTransaction();

        session.save(uni);

        session.getTransaction().commit();
        }catch(Exception e){
            if(session.getTransaction() != null){
                session.getTransaction().rollback();
            }
            System.out.println("Error: "+e.getMessage());
        }
    }

    public void closeSessionFactory(){
        sessFac.close();
    }

}

И я получаю

Error: Could not execute JDBC batch update
Error: could not execute query

при попытке сохранить или показать что-то.Помогите пожалуйста.

1 Ответ

3 голосов
/ 18 февраля 2011

Первое, что вы должны сделать, это добавить аннотацию @JoinColumn, где применяется @ManyToOne, потому что в противном случае будет применяться значение по умолчанию.@JoinColumn имеет имя параметра, которое указывает, какой столбец в базе данных используется для связи.Посмотрите документацию для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...