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 来包含任何添加的逻辑。
很抱歉这个太基础的问题,我没有使用 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 来包含任何添加的逻辑。