Spring Data Restを使用して、同じJPAエンティティに対して2つの異なるリポジトリを公開することは可能ですか? 2つのリポジトリに異なるパスとrel-namesを指定しましたが、RESTエンドポイントとして使用できるのは2つのうちの1つだけです。2つのリポジトリがある理由は、その1つがエンティティの基本的なフィールドのみを示す抜粋。
ひどい部分は、エンティティごとに1つのスプリングデータレストリポジトリ(@RepositoryRestResource)しか持てないことだけでなく、also通常のJPA @Repository(CrudRepositoryやPagingAndSortingなど)がある場合にも相互作用しますスプリングデータは残り1つです(マップのキーはエンティティ自体です)。どちらか一方のランダムロードをデバッグしてかなりの時間を失いました。これが春のデータの残りのハード制限である場合、値をオーバーライドしようとしたときにマップのキーがすでにそこにあると、少なくとも例外がスローされる可能性があると思います。
結局、_@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つのリポジトリしか使用できません...ただし、テーブルごとに複数のエンティティを作成できます。したがって、テーブルごとに複数のリポジトリーがあります。
私が書いた少しのコードで、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つはエンティティで、すべてのセッターがありますが、公開するフィールドのゲッターのみです。これは理にかなっていますか?