0

我正在使用 Spring 3.2、Hibernate 4 和 MySQL。我有一个名为 Lecturers 的自引用类,它具有实现父/子一对多关系的注释。我在实现控制器和表单以从同一个表中保存父母和孩子时遇到问题。这是一个自引用类。

我的数据库:

CREATE TABLE `lecturers` (
`lecturer_id` BIGINT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NULL DEFAULT NULL,
`email` VARCHAR(255) NULL DEFAULT NULL,
`checker_id` BIGINT(20) NULL DEFAULT NULL,
PRIMARY KEY (`lecturer_id`),
FOREIGN KEY (`checker_id`) REFERENCES `lecturers` (`lecturer_id`)

Java 类

@ManyToOne
@JoinColumn(name="checker_id")
private Lecturer checker;

@OneToMany(cascade = CascadeType.ALL, mappedBy="checker", orphanRemoval=true)
private List<Lecturer> lecturers = new ArrayList<Lecturer>();

而且类也有这个方法

@Transient
public void addLecturer(Lecturer lecturer) {
    if(lecturers == null) {
        lecturers = new ArrayList<Lecturer>();
        //lecturers = new HashSet<Lecturer>();
    }
    lecturer.setChecker(this);
    lecturer.setLecturers(lecturers);
    //lecturer.setLecturers(lecturers);

    lecturers.add(lecturer);
    // TODO Auto-generated method stub

}

然后我设置了一个 DAO 和服务层来实现 CRUD 操作。创建方法是这样的:

  Session session = sessionFactory.getCurrentSession();

    transaction = session.beginTransaction();

// Create new lecturers
    Lecturer lecturer1 = new Lecturer();
    lecturer1.setName(name);
    lecturer1.setEmail(email);

    Lecturer lecturer2 = new Lecturer();
    lecturer2.setName(name);
    lecturer2.setEmail(email);

       // Create new checker
    Lecturer checker = new Lecturer();
    checker.setName(name);
    checker.setEmail(email);
    checker.setChecker(checker);


    List<Lecturer> lecturers = new ArrayList<Lecturer>();
    lecturers.add(lecturer1);
    lecturers.add(lecturer2);
    lecturer1.setChecker(checker);
    lecturer2.setChecker(checker);

    checker.addLecturer(lecturer1);
    checker.addLecturer(lecturer2);

    checker.setLecturers(lecturers);

  session.save(checker);


    session.save(lecturer1);
    session.save(lecturer2);

我现在的要求是提供一个表格,用于将父母(检查者)与一个或多个孩子(讲师)匹配并将匹配保存到数据库中。我在问我应该如何挽救这段关系。我应该分别创建父级和子级,然后将使用 id 的父级与从下拉列表中选择的子级匹配吗?我不确定如何确保检查员与其各自讲师之间的关系得到保存。

然后我创建了一个主类来测试关系并查看它是否有效。将数据插入数据库是可行的,但是当我想列出它时,我得到了:

Name: Mark
Email: ma@msn.com
Checker: com.professional.project.domain.Lecturer@439942
ID: 22

我应该取回我已经添加但它没有回来的检查器的名称。

对于如何进行,我将不胜感激。

4

1 回答 1

1

首先,您的 addLecturer() 方法有一个错误。它不应该将孩子的讲师列表设置为当前讲师的列表:

public void addLecturer(Lecturer lecturer) {
    if (lecturers == null) {
        lecturers = new ArrayList<Lecturer>(); // OK : lazy initialization
    }
    lecturer.setChecker(this); // OK : set the parent of the child to this
    lecturer.setLecturers(lecturers); // this line should be removed : the child's children shouldn't be the same as this lecturer's children

    lecturers.add(lecturer); // OK : ad the child to the list of children
}

当您获得讲师时,您将获得以下内容作为检查员:

Checker: com.professional.project.domain.Lecturer@439942

以上只是toString()检查器上调用默认方法的结果。要获得它的名字,请调用getName()检查器。如果您希望 toString() 方法返回名称,则以这种方式实现它:

@Override
public String toString() {
    return name;
}
于 2013-04-20T14:46:42.243 回答