我正在寻找一个通用项目模板来构建具有以下技术的 Web 应用程序:JSF2、Spring3 和 Hibernate4
我找到了一篇提出模板的文章,但我犹豫了,因为我的数据库中的每个表都需要 5 个类/接口:
- 2个接口(dao + service)
- 2个实现类
- 1个豆
那这正常吗?有人可以帮助更好的架构吗?
我将在 Spring Data JPA 模块之上构建架构。这将为您留下一个用于实体的类和一个用于存储库的接口(在正常情况下)。
有关更多信息,请查看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/JPAEntityManager
已经是一个通用的 CRUD DAO,所以你不必为每个实体创建一个 DAO。在必要时立即介绍它们,并EntityManager
在您的服务中使用直到那时。
免责声明:这是一种精简的 Java EE 方法,非常接近 Adam Bien 在他的《Java EE 模式》一书中推荐的方法。我们为春天调整了这个,到目前为止它工作得很好。
顺便说一句,这是一个很好的问题,Java 人经常忘记问自己“我们真的需要这个吗?”。