1

我正在寻找一个通用项目模板来构建具有以下技术的 Web 应用程序:JSF2、Spring3 和 Hibernate4

我找到了一篇提出模板的文章,但我犹豫了,因为我的数据库中的每个表都需要 5 个类/接口:

  • 2个接口(dao + service)
  • 2个实现类
  • 1个豆

那这正常吗?有人可以帮助更好的架构吗?

4

2 回答 2

2

我将在 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;
于 2013-03-05T12:31:31.713 回答
2

如果将 CGLib 作为依赖项包含在内,则可以摆脱接口。除非您从一开始就有不同的服务实现,否则您将不需要它们。仅在确实需要时才介绍它们(如果您问我,1:1 Service:ServiceImpl 是一种反模式)。

Hibernates/JPAEntityManager已经是一个通用的 CRUD DAO,所以你不必为每个实体创建一个 DAO。在必要时立即介绍它们,并EntityManager在您的服务中使用直到那时。

免责声明:这是一种精简的 Java EE 方法,非常接近 Adam Bien 在他的《Java EE 模式》一书中推荐的方法。我们为春天调整了这个,到目前为止它工作得很好。

顺便说一句,这是一个很好的问题,Java 人经常忘记问自己“我们真的需要这个吗?”。

于 2013-03-05T12:43:15.613 回答