Java 如何首先保存不带';不存在然后在JPA多人关系中设置它?

Java 如何首先保存不带';不存在然后在JPA多人关系中设置它?,java,hibernate,jpa,jakarta-ee,transactions,Java,Hibernate,Jpa,Jakarta Ee,Transactions,在我的场景中,article和tag是一种多个单向关系 文章类 @Entity public class Article { ... @ManyToMany @JoinTable(name = "ARTICLE_TAG", joinColumns = @JoinColumn(name = "ARTICLE_ID"), inverseJoinColumns = @JoinColumn(name = "TAG_ID")) Set<Tag> tags;

在我的场景中,article和tag是一种多个单向关系

文章类

@Entity
public class Article {
    ...

    @ManyToMany
    @JoinTable(name = "ARTICLE_TAG", joinColumns = @JoinColumn(name = "ARTICLE_ID"), inverseJoinColumns = @JoinColumn(name = "TAG_ID"))
    Set<Tag> tags;

    ...
}
@RequsetScoped
@Transactional
public class ArticleService {

        public void createArticle(ArticleDTO articleDTO) throws Exception {
            Article article = DTOUtil.map(articleDTO, Article.class);

            // check then set tags;
            Set<Tag> tags = new HashSet<>();
            tags.addAll(validateKeywords(articleDTO.getKeywords()));
            article.setTags(tags);

            ...

            articleDAO.create(article);
        }

        private Set<Tag> validateKeywords(String[] keywords) {
            Set<Tag> tags = new HashSet<>();
            if (keywords.length != 0) {
                for (String keyword : keywords) {
                    try {
                        Tag tag = tagService.findTagByValue(keyword);
                        tags.add(tag);
                    } catch (NoResultException e) {
                        System.err.println(e.getMessage());
                        Tag tag = new Tag(TagType.KEYWORD);
                        tag.setTagValue(keyword);
                        tagService.createTag(tag);
                        tags.add(tag);
                   }
            }
        }
        return tags;
    }

    ...

}
@实体
公共类文章{
...
@许多
@JoinTable(name=“ARTICLE\u TAG”,joinColumns=@JoinColumn(name=“ARTICLE\u ID”),inverseJoinColumns=@JoinColumn(name=“TAG\u ID”))
设置标签;
...
}
我将ArticleDAO和TagDAO都设置为@ApplicationScoped,ArticleService和TagService都设置为@RequestScoped。在我的ArticleService中,我首先检查标记是否已经存在于数据库中,如果已经存在,则直接设置它,如果不存在,则方法tagService.findTagByValue()将抛出一个NoResultException,然后我将一个新标记保存到数据库中,然后在catch字段中设置它。但问题是,我确实发现标记已被持久化(我可以看到它的id已在调试控制台中设置了),但在我的数据库中,仍然没有记录,只有一行名为getSingleResult()的代码没有检索到任何实体,在输出控制台中没有打印任何其他信息。这似乎不是倒退,怎么了?这是我的密码:

ArticleService.class

@Entity
public class Article {
    ...

    @ManyToMany
    @JoinTable(name = "ARTICLE_TAG", joinColumns = @JoinColumn(name = "ARTICLE_ID"), inverseJoinColumns = @JoinColumn(name = "TAG_ID"))
    Set<Tag> tags;

    ...
}
@RequsetScoped
@Transactional
public class ArticleService {

        public void createArticle(ArticleDTO articleDTO) throws Exception {
            Article article = DTOUtil.map(articleDTO, Article.class);

            // check then set tags;
            Set<Tag> tags = new HashSet<>();
            tags.addAll(validateKeywords(articleDTO.getKeywords()));
            article.setTags(tags);

            ...

            articleDAO.create(article);
        }

        private Set<Tag> validateKeywords(String[] keywords) {
            Set<Tag> tags = new HashSet<>();
            if (keywords.length != 0) {
                for (String keyword : keywords) {
                    try {
                        Tag tag = tagService.findTagByValue(keyword);
                        tags.add(tag);
                    } catch (NoResultException e) {
                        System.err.println(e.getMessage());
                        Tag tag = new Tag(TagType.KEYWORD);
                        tag.setTagValue(keyword);
                        tagService.createTag(tag);
                        tags.add(tag);
                   }
            }
        }
        return tags;
    }

    ...

}
@RequsetScoped
@交易的
公共类文章服务{
public void createArticle(ArticleDTO ArticleDTO)引发异常{
Article Article=DTOUtil.map(articleDTO,Article.class);
//检查并设置标签;
Set tags=newhashset();
tags.addAll(validateKeywords(articleDTO.getKeywords());
第条.设置标签(标签);
...
创建(文章);
}
私有集validateKeywords(字符串[]关键字){
Set tags=newhashset();
如果(关键字.length!=0){
for(字符串关键字:关键字){
试一试{
Tag Tag=tagService.findTagByValue(关键字);
标签。添加(标签);
}捕获(noresulte异常){
System.err.println(e.getMessage());
Tag Tag=新标签(TagType.KEYWORD);
tag.setTagValue(关键字);
tagService.createTag(标签);
标签。添加(标签);
}
}
}
返回标签;
}
...
}

谢谢你的帮助

你认为“CMP”是什么?@SteveC它代表容器管理的持久性,所以我不需要每次调用entityManager.getTransaction().begin()和entityManager.getTransaction().commit()。我说的对吗?哈哈,你是说CMT,它是容器管理的事务。CMP是JPA的前身,并且可能是所有人都讨厌旧J2EE的第一竞争者。@SteveC哇,谢谢!我误解了许多重要的概念…在事务成功提交后,数据库才同步。到那时,您将看不到从外部到活动事务执行的DB操作。