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

如何为多个实体创建存储库?

尉迟宇定
2023-03-14

我试图创建一个简单的网站,其中托管主题和评论。我已经从主题开始,并为它们创建了存储库:

package com.myProject.mvc3.repository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TopicRepository extends CrudRepository<Topic, Integer>{    
     public List<Topic> findAllByTopicTag(Tag currentTag);
} 

我已经在servlet上下文中定义了存储库的路径。xml:

jpa:repositories base-package="com.myProject.mvc3.repository"

现在,我想在我的存储库中包含注释,但以下代码不起作用:

package com.myProject.mvc3.repository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CommentRepository extends CrudRepository<Comment, Integer> {
    public List<Comment> findTopicComments(Topic topic);

}

我的项目甚至都没建好。你能给我一个建议吗,如何为多个实体创建存储库(主题类和注释类是用@Entity声明的)?

我面对的是:

  • TopicRepository类图标上有HDD图片

org.springframework.beans.factory.BeanCreation异常:创建名为'org.springframework.web.servlet.mvc.annotation.DefaultAnNotationHandlerMap#0'的bean时出错:bean初始化失败;嵌套异常org.springframework.beans.factory.BeanCreation异常:创建名为'topicController'的bean时出错:自动加载依赖项注入失败;嵌套异常是org.springframework.beans.factory.BeanCreationExctive:无法自动绑定字段:私有com.epam.mvc3.service.CommentServicecom.epam.mvc3.controller.TopicController.commentService;嵌套异常是org.springframework.beans.factory.BeanCreationExctive:创建名为'评论Service'的bean时出错:自动加载依赖项注入失败;嵌套异常org.springframework.beans.factory.BeanCreation异常:无法Autowire字段:私有com.epam.mvc3.repository.CommentRepositorycom.epam.mvc3.service.CommentService.commentRepository;嵌套异常是org.springframework.beans.factory.BeanCreation异常:创建名称为“注释库”的bean时出错:FactoryBean在对象创建时抛出异常;嵌套异常是java.lang.IllegalArgument异常:找不到类型类的属性com.epam.mvc3.model.评论org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory. java: 456)org. springframework. bean. factory. support. AbstractBeanFactory1美元. getObject(AbstractBeanFactory. java: 293)org. springframework. bean. factory. support. DefaultSingletonBean注册. getSingleton(DefaultSingletonBean注册DefaultListableBeanFactory. preInstantiateSingletons(DefaultListableBeanFactory. java: 585)org. springframework. Context. support. AbstractApplication Context. finishBeanFactory初始化(AbstractApplication Context. java: 895)org. springframework. content. support. AbstractApplication Contexth(AbstractApplication Content. java: 425)org. springframework. web. servlet. FrameworkServlet. createWebApplication Context(FrameworkServlet. java: 467)org. springframework. web. servlet. FrameworkServlet. createWebApplication Context(FrameworkServlet. java: 483)org. springframework. web. servlet. FrameworkServlet. initWebApplication Context(FrameworkServlet. java: 358)org. springframework. web. servlet

共有2个答案

荣沈义
2023-03-14

尝试以以下方式编写存储库:

@Repository
public interface TopicRepository extends JpaRepository<Topic, Integer> >{    

     @Query("select topic from Topic topic where topic.topicTag.id=?1")
     public List<Topic> findAllByTopicTag(int topicTagId);
} 

@Repository
public interface CommentRepository extends JpaRepository<Comment, Integer> {

    @Query("select comment from Comment comment where comment.topic.id=?1")
    public List<Comment> findTopicComments(int topicId);
}

在本例中,我指定实体的id作为搜索条件,因为它们通常被用作外键。如果需要,您可以轻松添加其他搜索条件。

有关Spring数据中查询方法的更多详细信息,请参阅参考文档。

使现代化

关于您的错误堆栈跟踪-我认为这个错误意味着您没有在persistent.xml.中指定您的类

还有一种方法可以不指定持久化应用程序中的所有类。xml-

另外,如果您使用完整的java配置,您可以轻松地配置您的JPA项目,而无需persistent.xml文件。例如:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
    LocalContainerEntityManagerFactoryBean factoryBean = 
            new LocalContainerEntityManagerFactoryBean();

    factoryBean.setDataSource(dataSource());
    factoryBean.setPackagesToScan(new String[] {"com.dimasco.springjpa.domain"});

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setShowSql(true);
    //vendorAdapter.setGenerateDdl(generateDdl)

    factoryBean.setJpaVendorAdapter(vendorAdapter);

    Properties additionalProperties = new Properties();
    additionalProperties.put("hibernate.hbm2ddl.auto", "update");

    factoryBean.setJpaProperties(additionalProperties);


    return factoryBean;
}

正如您在本例中所看到的,我只是定义了要扫描的包。

狄侯林
2023-03-14

只需在findtopicomments中添加By,这样它就变成了findByTopicComments。当然,只有当Comment实体有topicComments字段,或者它有topic字段,而该字段又有comments字段时,这才有效。

顺便说一句,您不需要在Spring data jpa存储库上添加@Repository注释。

实际上,如果您的查询名与该类中的模式^(查找|读取|获取)(\\p{上}.*?)?? by不匹配,则会发生以下情况:

  • 任何前缀,如get、'read'和search都不会被删除,并且将被视为要生成的JPQL查询的一部分。在这种情况下,您将获得一个异常:java.lang.IllegalArgumentExctive:找不到类型类的属性...
  • 如果没有什么要从方法名中删除的,那么它将被处理,就像它之前有findBy前缀一样。

由于文档中没有明确说明这一点,我已经在Spring Data Commons问题跟踪器中创建了问题。

 类似资料:
  • 我开始使用SpringDataJPA存储库。我们已经有一个应用程序使用了Spring MVC(无Spring Boot或Spring数据JPA),在那里我们编写了一个Generic DAO类,该类处理我们拥有的几乎所有实体的基本CRUD操作。任何其他特殊操作都可以通过编写自定义DAO来处理。 现在,Spring data JPA让事情变得非常简单,只需要我们编写一个接口,剩下的就交给我们了。 这很

  • 我想使用SpringDataRepository接口来执行本机查询——我认为这种方式最简单,因为复杂性较低。 但是当扩展接口时。

  • 在Spring Data JPA的“入门”示例中,我们创建了一个扩展CrudRepository的接口。但是,它只处理一个实体: 在现实世界的应用程序中,有许多实体(表),我们需要对它们进行CRUD操作。使用具有多个(相关或无关)实体的Spring数据JPA存储库的正确方法是什么? 我是否必须为每个实体创建接口并逐个自动连接它们(现在听起来这是一个非常疯狂的想法)?

  • 问题内容: 我是一个自学者。当前,我正在制作一个需要矩阵型数据库的GUI项目。 我想学习如何创建一个可以在arraylist中存储多个对象的类。 这是我的示例代码。请注意,这只是我的尝试。该代码尚未完成,因此无法正常工作。 谢谢你的热心帮助。 }} 问题答案: 我认为一种更好的方法是创建一个用户信息类来存储特定用户的信息。 然后将其放入ArrayList中。 然后,对于您当前的方法,您可以

  • 和类似的服务: 我用的是12个实体,大家的服务方式都一样。 谢谢!

  • 问题内容: 我正在使用MVC创建一个基本的计算器。到目前为止,我正在改编一个教程,该教程仅将两个用户输入的值加在一起。 目前,我要添加到视图中的每个按钮都有其自己的侦听器,可以。但是,根据教程的控制器每个按钮只有一个ActionListener内部类。这重复了大量代码。 如何为所有按下的按钮创建一个ActionListener类,并在按下的按钮的ID上使用case语句? 在视图中注册oneButt