2

<T> T findOrCreate(Supplier<Optional<T>> finder, Supplier<T> factory)すべてのリポジトリにa を紹介したいと思います。新しいインターフェイスを作成しました

@NoRepositoryBean
public interface ExtendedJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    T findOrCreate(Supplier<Optional<T>> finder, Supplier<T> factory);
}

.

public class ExtendedJpaRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements ExtendedJpaRepository<T, ID> {

    private final JpaEntityInformation entityInformation;
    private final EntityManager entityManager;

    public ExtendedJpaRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.entityInformation = entityInformation;
        this.entityManager = entityManager;
    }

    @Override
    public T findOrCreate(Supplier<Optional<T>> finder, Supplier<T> factory) {
        throw new NotImplementedException("No implemented yet");
    }
}

次に、RecipeIngredientRepository などの具象リポジトリでこのインターフェイスを使用します。

public interface RecipeIngredientRepository extends ExtendedJpaRepository<RecipeIngredient, Long> {}

最終的にリポジトリをサービスに挿入すると、次の例外が発生します。

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'recipeIngredientRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property find found for type RecipeIngredient! Did you mean 'id'?

find私のエンティティでプロパティを探していますRecipeIngredient。私はそれをしたくありませんでした。これはJPA Query Methodsに関連していると思います。そのため、名前を から に変更し、findOrCreateクエリxxxメソッドの検出をバイパスします - 成功しませんでした。xxx次に、プロパティを検索します。

春のデータがこのプロパティを探すのは何ですか? を使用してorg.springframework.boot:spring-boot-starter-data-jpaいます。

4

2 に答える 2