web-dev-qa-db-ja.com

Spring Data Restの同じエンティティの複数のリポジトリ

Spring Data Restを使用して、同じJPAエンティティに対して2つの異なるリポジトリを公開することは可能ですか? 2つのリポジトリに異なるパスとrel-namesを指定しましたが、RESTエンドポイントとして使用できるのは2つのうちの1つだけです。2つのリポジトリがある理由は、その1つがエンティティの基本的なフィールドのみを示す抜粋。

25
Gregor

ひどい部分は、エンティティごとに1つのスプリングデータレストリポジトリ(@RepositoryRestResource)しか持てないことだけでなく、also通常のJPA @Repository(CrudRepositoryやPagingAndSortingなど)がある場合にも相互作用しますスプリングデータは残り1つです(マップのキーはエンティティ自体です)。どちらか一方のランダムロードをデバッグしてかなりの時間を失いました。これが春のデータの残りのハード制限である場合、値をオーバーライドしようとしたときにマップのキーがすでにそこにあると、少なくとも例外がスローされる可能性があると思います。

12
domgom

結局、_@Subselect_を使用して2番目の不変のエンティティを作成し、それを2番目のJpaRepsotoryにバインドして@RestResource(exported = false)に設定しました。これも問題の分離を促進します。

従業員の例

_@Entity
@Table(name = "employee")
public class Employee {

    @Id
    Long id

    String name

    ...

}
_
_@RestResource
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {

}
_
_@Entity
@Immutable   
@Subselect(value = 'select id, name, salary from employee')
public class VEmployeeSummary {

    @Id
    Long id

    ...

}
_
_@RestResource(exported = false)
public interface VEmployeeRepository extends JpaRepository<VEmployeeSummary, Long> {

}
_

コンテキスト

モノリシックアプリケーションの2つのパッケージには、異なる要件がありました。 CRUD関数を含むPagingAndSortingRepositoryでUIのエンティティを公開する必要がありました。もう1つは、ページングを行わずに並べ替えを行う集約バックエンドレポートコンポーネント用です。

Pageable.unpaged()をリクエストした後、PagingAndSortingリポジトリから結果をフィルタリングできたはずですが、一部のフィルタに対してListを返す基本的なJPAリポジトリが必要でした。

1

答えは次のようです。エンティティごとに可能なリポジトリは1つだけです。

1
Gregor

したがって、これは質問に直接回答するものではありませんが、根本的な問題の解決に役立つ可能性があります。

エンティティごとに1つのリポジトリしか使用できません...ただし、テーブルごとに複数のエンティティを作成できます。したがって、テーブルごとに複数のリポジトリーがあります。

私が書いた少しのコードで、2つのエンティティを作成する必要がありました。1つは自動生成されたIDで、もう1つはプリセットIDで、どちらも同じテーブルをポイントしています。

@Entity
@Table("line_item")
public class LineItemWithAutoId {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;

    ...
}



@Entity
@Table("line_item")
public class LineItemWithPredefinedId {

    @Id
    private String id;

    ...
}

次に、それぞれにリポジトリを用意しました。

public interface LineItemWithoutId extends Repository<LineItemWithAutoId,String> {

    ...

}


public interface LineItemWithId extends Repository<LineItemWithPredefinedId,String> {

    ...

}

投稿された問題については、2つのエンティティがある可能性があります。 1つは完全なエンティティで、すべてに対してゲッターとセッターがあります。もう1つはエンティティで、すべてのセッターがありますが、公開するフィールドのゲッターのみです。これは理にかなっていますか?

0
JRogerC