2010-09-27 3 views
2

Я хочу упорствовать следующий класс, в том числе 'бар'Hibernate: Как сохраняться в класс, который содержит Map <String, List <String>>

 
Class Foo 
{ 
    Map<String, List<String>> bar; 
    // ... 
    // other stuff..... 
} 

Как это сделать в Hibernate? Если возможно, как это сделать в Hibernate с аннотациями?

О, характер ключа карты Строка в том, что их небольшое количество (5-40), и они одинаковы для экземпляров Foo. Строки в списке уникальны как внутри списка, так и между экземплярами Foo.

Спасибо.

+0

И каково будет представление базы данных? –

ответ

1

Ни строка, ни список является Entity, вы должны создать класс обертку, который инкапсулирует ваш список

Не забывайте сеттер в

@Entity 
public class Foo { 

    private MutableInt id = new MutableInt(); 

    private Map<String, CustomList> customListMap = new HashSet<String, CustomList>(); 

    @Id 
    @GeneratedValue 
    public Integer getId() { 
     return this.id.intValue(); 
    } 

    public void setId(Integer id) { 
     return this.id.setValue(id); 
    } 

    @OneToMany 
    @MapKey(name="key") 
    public Map<String, CustomList> getCustomListMap() { 
     return customListMap; 
    } 

    // add convenience method 
    public void addBar(String key, String bar) { 
     if(customListMap.get(key) == null) 
      customListMap.put(key, new CustomList(new CustomListId(id, key))); 

     customListMap.get(key).getBar().add(bar); 
    } 

} 

и пользовательский CustomList (Не забудьте сеттер в)

@Entity 
public class CustomList { 

    private CustomListId customListId; 

    private List<String> bar; 

    private String key; 

    @EmbeddedId 
    public CustomListId getCustomListId() { 
     return customListId; 
    } 

    @Column(insertable=false, updatable=false) 
    public String getKey() { 
     return this.key; 
    } 

    @CollectionOfElements 
    @JoinTable(name="BAR") 
    public List<String> getBar() { 
     return this.bar; 
    } 

    @Embeddable 
    public static class CustomListId implements Serializable { 

     private MutableInt fooId = new MutableInt(); 
     private String key; 

     // required no-arg construtor 
     public CustomList() {} 
     public CustomList(MutableInt fooId, String key) { 
      this.fooId = fooId; 
      this.key = key; 
     } 

     public Integer getFooId() { 
      return fooId.intValue(); 
     } 

     public void setFooId(Integer fooId) { 
      this.fooId.setValue(fooId); 
     } 

     // getter's and setter's 

     public boolean equals(Object o) { 
      if(!(o instanceof CustomListId)) 
       return false; 

      CustomListId other = (CustomList) o; 
      return new EqualsBuilder() 
         .append(getFooId(), other.getFooId()) 
         .append(getKey(), other.getKey()) 
         .isEquals(); 
     } 

     // implements hashCode 

    } 

} 

Вы даже можете создать собственный метод, называемый getBar который en капсулирует ваш customListMap прозрачно следующим образом:

@Entity 
public class Foo { 

    ... 

    public Map<String, List<String>> getBar() { 
     Map<String, List<String>> bar = new HashMap<String, List<String>>(); 

     for(Entry<String, CustomList> e: customListMap()) 
      bar.put(e.getKey(), e.getValue().getBar()); 

     return bar; 
    } 

} 
+0

Класс CustomList находится внутри класса CustomList, что дает мне ошибку компиляции: – ggg

+0

CustomList.java:33: CustomList уже определен в неназванном пакете public static class CustomList реализует Serializable { – ggg

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