1

私は冬眠するのが初めてです。私はテーブルの部門と教師をしなければなりません。1 つの学科には複数の教師を配置できますが、1 人の教師は 1 つの学科にしか所属できません。次のマッピングがあります。

@Entity
@Table(name = "department")
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "description")
    private String description;

    @OneToMany (cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "department_id")
    private List<Teacher> teachers = new ArrayList<Teacher>();
}

@Entity
@Table(name = "teacher")
public class Teacher {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "fName")
    private String fName;

    @Column(name = "lName")
    private String sName;

    @Column(name = "degree")
    private String degree;

    @ManyToOne
    private Department department;
}

簡単にするために省略した getter と setter もあります。MySql データベースを使用しています。新しい教師で新しい部門を挿入しようとすると、すべてうまくいきます。しかし、各部門に割り当てられた教師がいる部門の完全なリストも取得できるようにしたいと考えています。現在、私のデータベースには 5 つの学科と 13 人の教師がいます。しかし、次のコードを実行すると:

    DepartmentDaoImpl ddi = new DepartmentDaoImpl();
    List<Department> departments = ddi.getAllDepartment();

    for (Department k : departments){
        printDepartmentData(k);
        List<Teacher> teachers = k.getTeachers();
        for (Teacher t : teachers){
            printTeacherName(t);
        }
    }

そして私の getAllDepartments 実装:

@Override
public ArrayList getAllDepartment() throws SQLException {
    Session session = null;
    ArrayList<Department> result = null;
    try{
        session = HibernateUtil.getSessionFactory().openSession();
        result = (ArrayList)session.createCriteria(Department.class).list();
    }catch(Exception ex){
        ex.printStackTrace();
    }finally{
        if(session != null && session.isOpen()){
            session.close();
        }
    }
    return result;
}

テーブルを作成するSQL:

CREATE TABLE teacher (
id INTEGER PRIMARY KEY auto_increment,
fName varchar(30),
lName VARCHAR(30),
degree VARCHAR(100),
department_id INTEGER
);
CREATE TABLE department(
id INTEGER PRIMARY KEY auto_increment,
name VARCHAR(100),
description VARCHAR(5000) 
);

部門の 13 のインスタンスを取得します。そして、最初の部門の 5 つのインスタンス (5 人の教師が割り当てられています) を取得し、それぞれに同じ 5 人の教師が割り当てられ、2 番目の部門の 2 つのインスタンス (2 人の教師が割り当てられています) のそれぞれに 2 人の同じ教師が割り当てられているため、の上。誰かがそれを修正する方法を理解できますか?
対応する数の教師とともに、部門の 5 つのインスタンスを取得する必要があります。

4

4 に答える 4

3

で 1 対多の関係を構成するためfetch = FetchType.EAGER、休止状態は 2 つのテーブルで結合を実行します。表示される結果は、この結合によるものです。

との両方に正しいequals()とメソッドがあることを確認してください。これで問題が解決しない場合は、 の代わりにを使用してみてください。hashCode()DepartmentTeacherSetList

于 2013-07-23T08:11:31.227 に答える
0

以下の変更を行い、テストします

   @OneToMany (cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="department")
    private List<Teacher> teachers = new ArrayList<Teacher>();
于 2013-07-23T07:50:53.230 に答える