2013-04-22 64 views
0

我的程序要求是将新的父项与子项一起添加到数据库中。到目前为止,我有在父类此方法:Spring Hibernate插入父项与子项一起

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

    this.lecturers.add(lecturer); 
} 

然后保存父在我父道:

@Override 
public void addChecker(Lecturer checker) { 
     Session session = sessionFactory.getCurrentSession(); 

     session.save(checker); 

    } 

我的控制器:

 @RequestMapping(value="/matching_page", method = RequestMethod.GET) 
public ModelAndView get(@ModelAttribute("checker") Lecturer checker, BindingResult 

    result) { 
ArrayList<String> lecturers = new ArrayList<String>(); 
    lecturers.add("Somma"); 
    lecturers.add("Trina"); 
    lecturers.add("Adam"); 
    lecturers.add("Eve"); 

    HashMap<String, ArrayList<String>> model = new HashMap<String 

    ArrayList<String>>(); 
    model.put("lecturerList", lecturers); 
    return new ModelAndView("matching_page", "model", model); 

} 

    @RequestMapping(value="/matching_page", method = RequestMethod.POST) 
public ModelAndView hello(@ModelAttribute("checker") Lecturer checker, 

    BindingResult result) { 
    lecturerService.addChecker(checker); 

    return new ModelAndView ("redirect:/admin"); 
} 

JSP表单:

我的数据库:
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`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

我的模型

@Entity 
    @Table(name = "lecturers") 
    @Component 
    public class Lecturer implements Serializable{ 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="checker_id") 
    private Lecturer checker; 

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

表单上绑定了一个父对象(检查),我想添加选择列表中选择并保存一个或更多的孩子。

保存工程,但它保存所有新的对象作为孩子,并不保存检查父母与检查ID分开。我不确定问题是什么,并想知道。

+0

你说这样可以节省所有的新对象作为孩子......但如何才能做到这一点(这意味着他们有一个父从而为'checker_id'的值)时,父(检查)是不是也得救了吗? – Mike 2013-04-22 19:26:13

回答

0

发布您的模型定义。我的猜测是,您的问题正在从您将“父母”与其“子女”联系起来的奇怪尝试中抬头。

随着休眠,你只有做一边,休眠会照顾另一边。举个例子:

public class MyObject { 
    @Id 
    private UUID id; 

    @ManyToOne 
    @JoinColumn(name = "myColumnName") 
    private MyObject parent; 

    @OneToMany(mappedBy = "parent") 
    private Set<MyObject> children; 

    public void addChild(MyObject child) { 
     children.add(child); 
    } 

    public void removeChild(MyObject child) { 
     children.remove(child); 
    } 

    // Other Accessors 
} 

使用它......

public MyObject create(MyObject parent) { 
    // Obtain a collection of MyObject that you would like to associate as "parent's" children 
    for (MyObject curObject : myListOfObjects) 
     parent.addChild(curObject); 
    sessionFactory.getCurrentSession().persist(parent); 
} 

我实际上并不设定每个孩子的parent因为Hibernate是要照顾这对我。我需要做的就是将每个孩子都放入父母的孩子集合中。如果在附属的非临时性实体上进行,则单独采取这种行为足以导致插入发生。

@Transactional 
public void update(parentId,child) { 
    myDaoClass.readById(parentId).addChild(child); 
    // When the current transaction ends, hibernate will issue a commit to persist the 
    // child that we added (created) here. No need to call session.persist(...) on it. 
    // Assuming no exceptions are thrown, of course. 
} 
+0

谢谢你的回复。我现在正在审阅您的建议。与此同时,我编辑了我的问题来添加模型。这是一堂课。 – user2259555 2013-04-22 19:51:41

+0

模型看起来不错。我相信你有其他数据(电子邮件,名称等)的id列和列注释,并且为简洁起见而将它们剪切掉了? – Mike 2013-04-22 20:02:54

相关问题