JSF2、Spring3、および Hibernate4 のテクノロジーを使用して Web アプリケーションを構築するための一般的なプロジェクト テンプレートを探しています。
テンプレートを提案する記事を見つけましたが、データベース内のテーブルごとに 5 つのクラス/インターフェイスが必要なためためらっていました。
- 2 つのインターフェース (dao + サービス)
- 実装用の 2 つのクラス
- 1豆
それで普通ですか?誰かがより良いアーキテクチャを手伝ってくれますか?
JSF2、Spring3、および Hibernate4 のテクノロジーを使用して Web アプリケーションを構築するための一般的なプロジェクト テンプレートを探しています。
テンプレートを提案する記事を見つけましたが、データベース内のテーブルごとに 5 つのクラス/インターフェイスが必要なためためらっていました。
それで普通ですか?誰かがより良いアーキテクチャを手伝ってくれますか?
Spring Data JPA モジュールの上にアーキテクチャを構築します。これにより、エンティティ用に 1 つのクラスが残り、(通常の状況では) リポジトリ用に 1 つのインターフェイスが残ります。
詳細については、 Spring のドキュメントをご覧ください。
短縮例:
春の設定:
<!-- Directory to scan for repository classes -->
<jpa:repositories
base-package="x.y.z.repositories" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="database" value="HSQL" />
</bean>
</property>
</bean>
実在物:
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@NotNull
private String name;
}
リポジトリ:
public interface ProductRepository extends CrudRepository<Product, Long> {
public List<Product> findByName(String name);
}
リポジトリを使用するには、単にそれを注入する必要があります。
@Autowired
private ProductRepository productRepository;
CGLib を依存関係として含めると、インターフェイスを取り除くことができます。最初からサービスの実装が異なる場合を除き、それらは必要ありません。本当に必要な場合にのみ導入してください (1:1 Service:ServiceImpl はアンチ パターンです)。
Hibernates/JPAsEntityManager
は既に一般的な CRUD DAO であるため、エンティティごとに DAO を作成する必要はありません。必要になったらすぐに導入し、EntityManager
それまではサービス内で使用してください。
免責事項: これは Java EE への無駄のないアプローチであり、Adam Bien が著書 Java EE Patterns で推奨しているものに非常に近いものです。これを春に適応させましたが、今のところ問題なく動作しています。
ところで、Java 関係者は「本当にこれが必要なのか?」と自問することを忘れがちです。