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

 <c:url var="saveUrl" value="/matching_page" /> 
<form:form modelAttribute="checker" method="POST" action="${saveUrl}"> 

<td>Checker </td> 
<tr> 
<td><form:hidden path="lecturerId" value="" /></td> 
</tr> 

    <tr> 
    <td><form:label path="name">Checker Name:</form:label></td> 
    <td><form:input path="name"/></td> 

    </tr> 

    <tr> 
    <td><form:label path="email">Email</form:label></td> 
    <td><form:input path="email"/></td> 

    </tr> 
    <td>Lecturers</td> 
    <td> 
     <form:select path="name" multiple="true"> 
     <form:option value="0" >Select </form:option> 
      <form:options items="${model.lecturerList}" /> 

     </form:select> 
    </td> 

    <div id="lower"> 
<input type="submit" value="Save Selection" class="button"/> 
</div> 
    </form:form> 

Моя база данных:

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>(); 
    } 

Форма имеет родительский объект (Накладной), связанный с ним, и я хочу, чтобы добавить один или несколько детей, выбранных из списка выбора и сохранены.

Сохранение работает, но оно сохраняет все новые объекты в качестве дочерних элементов и не сохраняет родительский элемент checker отдельно с идентификатором checker. Я не уверен, в чем проблема и хотела бы знать.

+0

Вы говорите, что сохраняет все новые объекты, как дети ... но как это можно сделать (что подразумевает они имеют родителя, таким образом, значение для 'checker_id'), когда родитель (шашка) также не является спасен? – Mike

ответ

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

+0

Модель выглядит хорошо. Надеюсь, у вас есть аннотации столбцов и столбцов для других данных (электронная почта, имя и т. Д.) И просто сокращены для краткости? – Mike

Смежные вопросы