1

トピックやコメントをホストする簡単なWebサイトを作成しようとしています。私はトピックから始めて、それらのリポジトリを作成しました:

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の写真があります
  • 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です:フィールドを自動配線できませんでした:private com.epam.mvc3.service.CommentService com.epam.mvc3.controller.TopicController.commentService; ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:「commentService」という名前のBeanの作成中にエラーが発生しました:自動配線された依存関係の注入に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:フィールドを自動配線できませんでした:private com.epam.mvc3.repository.CommentRepository com.epam.mvc3.service.CommentService.commentRepository; ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:「commentRepository」という名前のBeanの作成中にエラーが発生しました:FactoryBeanがオブジェクトの作成時に例外をスローしました。ネストされた例外はjava.lang.IllegalArgumentExceptionです:タイプクラスcom.epam.mvc3.model.Commentorg.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

で追加ByするだけfindTopicCommentsですfindByTopicComments。もちろん、これは、エンティティにフィールドがある場合、またはCommentエンティティにフィールドがある場合にのみ機能します。topicCommentstopiccomments

ところで、リポジトリ@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でクラスを指定していないことを意味していると思います。

persist.xmlですべてのクラスを指定しない方法もあります->詳細については、ここここを参照してください。

また、Springを使用すると、完全なJava構成を使用する場合、persistent.xmlファイルなしでJPAプロジェクトを簡単に構成できます。例えば:

@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 に答える