2011-07-09 9 views
2

レストランとタグの間に多くの関係があります。ここに私の実体である:Spring MVCに多対多を保存する

public class Restaurant { 
    @Id 
    @GeneratedValue 
    private int id; 
    (...) 
    @ManyToMany 
    @JoinTable(name="restaurant_tag", 
      joinColumns={@JoinColumn(name="restaurant_id")}, 
      inverseJoinColumns={@JoinColumn(name="tag_id")}) 
    private List<Tag> tags; 

そして:

私のコントローラで
public class Tag { 
    @Id 
    private int id; 
    private String name; 
    @ManyToMany 
    @JoinTable(name="restaurant_tag", 
      joinColumns={@JoinColumn(name="tag_id")}, 
      inverseJoinColumns={@JoinColumn(name="restaurant_id")}) 
    private List<Restaurant> restaurants; 

(追加)私が得た:

public ModelAndView myrestaurantadd(HttpServletRequest request, 
      HttpServletResponse response, Restaurant restaurant, String[] tags) throws Exception { 
     for(String tag : tags){ 
      Tag x = new Tag(); 
      x.setName(tag); 
     restaurant.getTags().add(x); 
     } 

そして、私のjspで:

<form:form action="myrestaurantadd.htm" modelAttribute="restaurant" commandName="restaurant"> 
(...) 
<form:select path="tags" multiple="true" items="${tagList}" itemLabel="name" itemValue="id"/> 

すべてOKを示しています、私はタグで複数選択しましたが、私は「保存」をクリックしたときに、私はこのエラーを得た:

> org.springframework.web.util.NestedServletException: 
> Request processing failed; nested 
> exception is 
> org.springframework.beans.BeanInstantiationException: 
> Could not instantiate bean class 
> [[Ljava.lang.String;]: No default 
> constructor found; nested exception is 
> java.lang.NoSuchMethodException: 
> [Ljava.lang.String;.<init>() 
+1

あなたのエラーには関係ありませんが、マッピングが間違っています:関連付けの1つは、@ManyToMany(mappedBy = "...")を使用してもう一方の逆でなければなりません。 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1727を参照してください。また、アソシエーションの両側を常に初期化します(つまり、add x.getRestaurants()。add(restaurant)) –

答えて

4

あなたのコントローラ上のごrestaurantオブジェクトのtagsプロパティのカスタムプロパティエディタを定義する必要があります。

@InitBinder 
    protected void initBinder(HttpServletRequest request, 
      ServletRequestDataBinder binder) throws Exception { 

     super.initBinder(request, binder); 

     binder.registerCustomEditor(List.class, "tags",new CustomCollectionEditor(List.class){ 

      @Override 
      protected Object convertElement(Object element) { 
       Tag tag = new Tag(); 

       if (element != null) { 
        Long id = Long.valueOf(element.toString()); 
        tag.setId(id); 
       } 
       return tag; 
      } 
     }); 

    } 
関連する問題