我正在使用 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
我应该取回我已经添加但它没有回来的检查器的名称。
对于如何进行,我将不胜感激。