Hibernate - 如何映射代表集合的对象

Hibernate - How to map object that represent an collection

很抱歉这个太基础的问题,我没有使用 Hibernate 的经验,也没有尝试映射这个 classes 并且没有找到将一个对象映射到另一个表示列表的对象的示例。

关键字属性曾经是一个字符串列表,例如:

List<String> keywords; 

但我将其封装在 class 上以添加更专业的行为,遵循 Bob C. Martin 的书 "Clean Code"。但是我不知道如何映射它,就好像当列表在自己的 class.

中时它具有相同的行为一样
@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;
    }
}

看起来你将这个成员拆分成一个单独的class,主要是为了添加 ofPhrase() 静态方法。

我建议将该方法放在它自己的非 JPA 中 class,命名为 KeywordTokenizer,并使其成为非静态的。这将允许您单独测试分词器逻辑,并在测试其他使用它的 classes 时模拟 ofPhrase() 方法。我想鲍勃叔叔也会赞同这一点。

更一般地说——以我的微薄经验,JPA 对象应该只用于定义数据结构——所有 JPA 注释的东西都足够复杂,值得单独 class。使用 "service" 类型 class 类型,例如上面建议的 KeywordTokenizer 来包含任何添加的逻辑。