2013-04-22 51 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

相關問題