0

私のプログラム要件は、新しい親を子とともにデータベースに追加することです。これまでのところ、親クラスにこのメソッドがあります:

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

    this.lecturers.add(lecturer);
 }

次に、親daoの保存親:

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

フォームには親オブジェクト (チェッカー) がバインドされており、選択リストから選択して保存した 1 つ以上の子を追加したいと考えています。

保存は機能しますが、すべての新しいオブジェクトを子として保存し、チェッカーの親をチェッカー ID で個別に保存しません。何が問題なのかわからず、知りたいです。

4

1 に答える 1

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

Hibernate が面倒を見てくれるので、実際に各子を設定する必要はありません。parent私がする必要があるのは、各子を親の子のコレクションに入れることだけです。この行為だけで、非一時的で付加されているエンティティに対して挿入が発生するのに十分です。

@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.
}
于 2013-04-22T19:37:57.867 に答える