【问题标题】:How to use Spring Data Repositories as Vaadin JPAContainer如何使用 Spring Data Repositories 作为 Vaadin JPAContainer
【发布时间】:2013-08-09 01:10:03
【问题描述】:

是否可以将 org.springframework.data.jpa.repository.JpaRepository 存储库用作 Vaadin 的 JPAContainer?

我们正在使用 Spring 3.2 从头开始​​设置一个新的 Vaadin 7 项目。

Spring 集成通过Spring Vaadin Integration Addon 完成。

【问题讨论】:

  • 克里斯,你找到解决办法了吗?我正在为同样的问题苦苦挣扎,目前我加载了一个实体列表,创建了一个 BeanContainer,在 foreach 循环中添加实体并将其添加到表中。有没有更好的办法?
  • 不行,我需要自己实例化 JPAContainer。我自动装配 EntityMangerFactory,然后将其传递给新的 JPAContainer

标签: java spring vaadin spring-data-jpa


【解决方案1】:

Spring Data 与 JPAContainer 的架构不兼容。一般来说,我建议根本不要使用 JPAContainer,而只是从 Spring Data 存储库中获取实体并将它们传递给 Vaadin 组件。示例:

grid.setContainerDataSource(new BeanItemContainer(Person.class, repo.findAll());

在 Vaadin 8 发布之前,我还建议使用 Viritin(我是作者,并且十年来一直在维护和开发 Vaadin 本身),它可以为您提供更好的打字、更简单的 API 和更好的性能。有关完整堆栈示例应用程序,请参阅 this Spring Data CRUD example。

【讨论】:

    【解决方案2】:
        import javax.persistence.EntityManager;
        import javax.persistence.PersistenceContext;
    
        import com.vaadin.addon.jpacontainer.JPAContainer;
        import com.vaadin.addon.jpacontainer.JPAContainerFactory;
    
        @SpringComponent
        public class SpringDataVaadinJPAContainer {
            @PersistenceContext
            private EntityManager entityManager;
    
            public SpringDataVaadinJPAContainer() {
                JPAContainer<Person> container = JPAContainerFactory.make(Person.class, entityManager);
    
            }
        }
    

    【讨论】:

      【解决方案3】:

      只要您可以从 JPARepository 或其他地方获取 EntityProvider,您就可以像这样使用 JPAContainer:

      EntityManager entityManager = getEntityManager(Campaign.class));
      MutableLocalEntityProvider<Campaign.class)> provider;
      provider = new CachingMutableLocalEntityProvider<Campaign.class)>(Campaign.class), entityManager);
      provider.setTransactionsHandledByProvider(false);
      JPAContainer<Campaign> container = new JPAContainer<Campaign>(Campaign.class);       container.setEntityProvider(EntityProviderUtil.get().getEntityProvider(Campaign.class));
      

      还是简单的

      EntityManager entityManager = getEntityManager(Campaign.class));
      JPAContainer<Campaign> container = JPAContainerFactory.make(Campaign.class, entityManager)
      

      好吧,您应该阅读以下帖子并决定是否不想将 JPARepository 用作模型层并将其包装到 BeanItemContainer 中,因为 JPAContainer 看起来不错,但从我的角度来看存在一些性能问题。

      JPAContainer issues and different approach

      MVP pattern and POJO binding with Hibernate

      【讨论】:

      • 我的目标是从应用程序上下文中获取一个 JPAContainer。例如,spring 为每个 JPARepository 实例化一个 JPAContainer。我不喜欢自己实例化它们。
      猜你喜欢
      • 2013-06-14
      • 2012-11-20
      • 2015-02-07
      • 1970-01-01
      • 2023-03-23
      • 2013-02-20
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多