就我而言,文章和标签是单向的ManyToMany关系。
Article.class
@Entity
public class Article implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToMany
@JoinTable(name = "ARTICLE_TAG", joinColumns = @JoinColumn(name = "ARTICLE_ID"), inverseJoinColumns = @JoinColumn(name = "TAG_ID"))
private Set<Tag> tags;
...
}
Tag.class
@Entity
public class Tag implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String tagValue;
// tagType can be category or keyword
private TagType tagType;
}
所以你可以看到,我需要在我的文章中设置标签。有些标签之前可能已经保存到数据库中,因此我的服务方法将首先检查它,如果标签已经存在,则进行设置。如果没有,该方法将导致NoResultException,然后我捕获Exception并希望在catch字段中执行save操作以及设置标记。这是代码
ArticleSerivce.class
public void createArticle(ArticleDTO articleDTO) throws Exception {
Article article = new Article();
// check and then set tags;
Set<Tag> tags = new HashSet<>();
tags.addAll(validateKeywords(articleDTO.getKeywords()));
article.setTags(tags);
...
articleService.createArticle(article);
}
private Set<Tag> validateKeywords(String[] keywords) {
Set<Tag> tags = new HashSet<>();
if (keywords.length != 0) {
for (String keyword : keywords) {
try {
// first check that if the tag is already existed
Tag tag = tagService.findTagByValue(keyword);
tags.add(tag);
} catch (NoResultException e) {
System.err.println(e.getMessage());
// if doesn't existed, then create it
Tag tag = new Tag(TagType.KEYWORD);
tag.setTagValue(keyword);
tagService.createTag(tag);
tags.add(tag);
}
}
}
return tags;
}
问题是,我确实发现 NoResultException 已被捕获,因为信息已在输出控制台中打印,我还调试了应用程序并发现标签已创建但是有线ID (想象我的dataTable中已经有4个标签,他们的id是1,2,3,4,然后我创建了3个不存在的标签,但id为5,6, null < / em>,为什么最后一个人的身份不是 7 ?)。最后,文章无法创建,输出控制台中没有错误或任何信息,当然,我的文章dataTable中没有记录。它是如此有线!那有什么不对?我想也许在捕获领域发生了一些事情。所以请帮助我,非常感谢你!