当前位置: 首页 > 知识库问答 >
问题:

Spring data JPA save vs JPA托管对象

赫连实
2023-03-14

例如,假设我们有三个实体:messageauthorlabel。一条消息可以有多个标签,但只能有一个作者。

所以消息基本上是:

@Entity
public class Message implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    @ManyToMany
    private Set<Label> labels = new HashSet<>();
    @ManyToOne
    private Author author;
    ...
}

链接是单向的。

  Author a = new Author("auteur A");
  a = authorRepository.save(a);
  Message msg = new Message("un message", "texte du message", a);
  msg = messageRepository.save(msg);            
  for (int i=0; i < 10; i++) {
    Label lab = new Label("label"+i);
    lab = labelRepository.save(lab);
    labelRepository.flush();                
    msg.addLabel(lab);
  }            
  messageRepository.save(msg);
 EntityManagerFactory emf = Persistence.createEntityManagerFactory("demo1PU");
 EntityManager em = emf.createEntityManager();
 EntityTransaction transaction = em.getTransaction();
 transaction.begin();
 Author a = new Author("auteur A");
 em.persist(a);
 Message msg = new Message("un message", "texte du message", a);
 em.persist(msg);            
 for (int i=0; i < 10; i++) {
   Label lab = new Label("label"+i);
   em.persist(lab);              
   msg.addLabel(lab);
 }            
 transaction.commit();        
 em.close();
 emf.close();

显然,Spring管理的实体与常规EntityManager操作的实体有点不同。但是有什么明确的文档吗?spring-data-jpa-reference.pdf文件帮助不大。

共有1个答案

宗冠宇
2023-03-14

好吧,只是为了避免人们很难弄清楚问题是什么:

事实上,违反规定的代码如下:

 @Transactional
 @PostConstruct
 public void initDatabase() {        
        if (messageRepository.count() == 0) {
            Auteur a = new Auteur("auteur A");
            a = auteurRepository.save(a);
            Message msg = new Message("un message", "texte du message", a);
            msg = messageRepository.save(msg); // (pas nécessaire, vu qu'on le fait à la fin de la méthode...)
            for (int i = 0; i < 10; i++) {
                Label lab = new Label("label" + i);
                lab = labelRepository.save(lab);
                msg.addLabel(lab);
            }          
        }
    }

而且问题是,当调用@postconstruct带注释的方法时,依赖注入已经做了,这很好,但是整个应用程序上下文还没有准备好,所以代码没有在一个事务中执行。

 @Transactional
 @EventListener(ContextRefreshedEvent.class)
 public void initDatabase() {        
  ...
 }
 类似资料:
  • 托管 本页告诉你如何在自己的服务器上托管 .crx文件。如果你仅仅通过Chrome Web Store发布扩展,应用,或者主题那么你不需要本页。取而代之的是查阅Chrome Web Store帮助和开发者文档。 注意:如果你已经把扩展发布到扩展库,扩展就会合并到Chrome Web Store里。 按照惯例, 无论是Chrome Web Store还是特定服务器所提供的扩展, 可安装的web ap

  • 托管bean它是一个纯Java类,它包含一组属性和一组,方法。 以下是托管bean方法执行的常见功能: 验证组件的数据 处理组件触发的事件 执行处理以确定应用程序必须导航的下一页 它也可以作为JFS框架的模型。 JSF托管Bean示例 请看看下面一段示例代码 - 您可以通过以下方式使用此。 通过配置成XML文件。 通过使用注释。 通过XML文件配置托管Bean 在xml文件配置是比较旧方法。 在这

  • Blade 中认为组件就是一种类型的 Bean 或者叫对象,框架内置了简单的 IOC 容器来帮你将他们托管起来。 这样用户在使用的时候就可以达到对象复用,不必无限的使用 new 关键词带来内存泄漏。那么我们在使用组件的 时候就要干2件事:1、创建一个组件 2、让 Blade 托管该组件 核心特征 常驻内存,我们的组件被框架托管后实际上以单例的方式存储在缓存池中,用的时候取出来就可以了。 组件类型

  • 内容管理托管/API工具 API CMS 工具: prismic.io [free to $] contentful [$] Cosmic JS [free to $] Hosted CMS tools: LightCMS [$] Surreal CMS [$] Page Lime [$] Cushy CMS [free to $] Static CMS tools: webhook.com

  • 本章聊一下: 如何把 gitbook 的书稿备份到 github.com。 如何用 gh-pages 服务,托管我们的笔记成为一个网站

  • 我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati