2015-12-13 3 views
0

Извините за слишком простой вопрос, у меня нет опыта работы с Hibernate и попытка сопоставить эти классы и не найти пример, который сопоставляет объект другому объекту, представляющему список.Hibernate - Как сопоставить объект, представляющий коллекцию

атрибутов ключевых слов используются, чтобы быть списком строки, как:

List<String> keywords; 

но я инкапсулировать его на классе, чтобы добавить более специализированное поведение, следуя книгу «Чистый код» от Боба С. Мартина. Но я понятия не имею, как сопоставить его, как если бы у него было такое же поведение, когда список был в собственном классе.

@Entity 
@Table(name = "produtos") 
public class Product { 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @Embedded 
    private BarCode barCode; 

    @ManyToOne 
    private Manufacturer manufacturer; 

    private String description; 
    //How to map? 
    private Keywords keywords; 

} 


public class Keywords { 

    private List<String> wordList = new ArrayList<>(); 

    public void add(String keyword) { 
     wordList.add(keyword); 
    } 

    public boolean contains(String keyword) { 
     return wordList.contains(keyword); 
    } 


    public static Keywords ofPhrase(String phrase) { 
     Keywords keywords = new Keywords(); 
     StringTokenizer tokenizer = new StringTokenizer(phrase, " ", false); 
     while (tokenizer.hasMoreTokens()) { 
      String t = tokenizer.nextToken(); 
      if (t.length() > 4 && !keywords.contains(t)) { 
       keywords.add(t); 
      } 
     } 
     return keywords; 
    } 

    public List<String> getWordList() { 
     return wordList; 
    } 
} 

ответ

1

Похоже, вы разделили этот элемент на отдельный класс, главным образом, чтобы добавить статический методPhrase().

Я предлагаю использовать этот метод в своем собственном классе, отличном от JPA, именовать что-то вроде KeywordTokenizer, а также сделать его нестатичным. Это позволит вам изолировать логику токенизатора, а также издеваться над методом thePhrase() при тестировании других классов, которые его используют. Я думаю, что дядя Боб тоже одобрит это.

В более общем плане - в моем скромном опыте объекты JPA должны использоваться только для определения структуры данных - все, что делает материал аннотации JPA достаточной сложностью, чтобы заслужить собственный класс. Используйте классы типа «службы», такие как предложенный выше KeywordTokenizer, чтобы включить любую добавленную логику.

+0

Я сделал несколько рефакторингов. Как вы предлагаете, я создаю класс KeywordTokenizer и отделяю задание токенизатора от класса Keywords: https://gist.github.com/alexpfx/f99c841ec19b7a9d4653 https://gist.github.com/alexpfx/c8235cb95af3ee34526c Я не знаю, является ли это именно то, что вы имеете в виду? – alexpfx

+0

Да. Теперь, когда у вас есть этот класс, вы можете сохранить класс продукта простым и вообще не использовать класс Keywords. – orange77

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