1

我正在尝试创建一个简单的网站,其中包含主题和评论。我从主题开始,并为它们创建了存储库:

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-context.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 pic
  • CommentRepository类图标上有一个问号
  • 错误日志(一个巨大的):

org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0”的bean时出错:bean初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“topicController”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 com.epam.mvc3.service.CommentService com.epam.mvc3.controller.TopicController.commentService;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“commentService”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 com.epam.mvc3.repository.CommentRepository com.epam.mvc3.service.CommentService.commentRepository;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“commentRepository”的 bean 时出错:FactoryBean 在创建对象时抛出异常;嵌套异常是 java.lang.IllegalArgumentException: No property find found for type class com.epam.mvc3.model.Comment org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) org.springframework.beans .factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) org.springframework.beans。

4

2 回答 2

2

只需添加ByfindTopicComments使其成为findByTopicComments. 当然,这只有在Comment实体有topicComments字段或者它有topic字段的情况下才有效,而该字段又具有comments字段。

顺便说一句,您不需要@Repository对存储库进行注释Spring-data-jpa

^(find|read|get)(\\p{Upper}.*?)??By实际上,如果您的查询名称与此类的模式不匹配,则会发生以下情况:

  • 任何前缀,例如get,'read',find都不会被剥离,将被视为JPQL要生成的查询的一部分。在这种情况下,您将得到一个例外: java.lang.IllegalArgumentException: No property find found for type class ....
  • 如果您的方法名称中没有任何内容可以删除,那么它将被处理,就好像它之前有findBy前缀一样。

由于从文档中不清楚这一点,我在问题跟踪器中创建了问题。Spring Data Commons

于 2012-08-27T12:53:34.820 回答
1

尝试以这种方式编写您的存储库:

@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 Data 中查询方法的更多详细信息,您可以在参考文档中找到。

更新

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

还有一种方法可以不在您的 persistent.xml 中指定所有类 -> 请查看此处此处了解详细信息。

同样使用 Spring,如果您使用完整的 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;
}

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

于 2012-08-26T18:32:37.793 回答