1

我目前正在开发一个 Spring Roo/JPA 应用程序,最近我切换到基于 JPA 继承的域模型。总结一下我的域模型,我有一个抽象Member实体,它由两个实体子类化:MaleFemale.

在我所有的 Spring MVC 控制器中,我希望避免总是注入两个服务依赖项(一个处理Male实体,另一个处理Female实体)。我宁愿拥有一项MemberService服务(连同相应的MemberRepository),它会返回一个Male实例或一个Female实例。

以上是否可以使用 Spring Roo 注释,例如:

  • @RooService(domainTypes = { Member.class })或者那个:
  • @RooJpaRepository(domainType = Member.class)?

例如,这会Member findByEmail(String email);返回一个我可以转换FemaleorMale类型的对象吗?

更一般地说,在 Spring 控制器和 Spring 服务级别处理实体继承的最佳实践是什么?

4

1 回答 1

0

我认为最好的方法是为男性和女性提供一个存储库,使用:

repository jpa --interface ~.repository.MaleRepository --entity ~.domain.Male
repository jpa --interface ~.repository.FemaleRepository --entity ~.domain.Female

你得到:

@RooJpaRepository(domainType = Female.class)
public interface FemaleRepository {
}

@RooJpaRepository(domainType = Male.class)
public interface MaleRepository {
}

然后为这些模型的应用程序创建服务层(每个模型的服务)

service --interface ~.service.MaleService --entity ~.domain.Male
service --interface ~.service.FamaleService --entity ~.domain.Female

然后你得到:

@RooService(domainTypes = { Male.class })
public interface MaleService {
}

@RooService(domainTypes = { Female.class })
public interface FemaleService {
}

这是假设您的男性和女性对象具有不同的责任,因此需要将其划分为不同的类,按照您给它们的名称(男性和女性)我认为他们没有,但我不知道您的业务逻辑和当然这只是一个例子(但对你真正的问题有多忠实?)。

继承的想法不仅是与“is-a”后代共享通用功能,而且保留 OO 逻辑的意义,当我说我的意思时,例如,在这种情况下,您可以使用名为 sex 的属性解决问题如果男性和女性具有相同的属性;如果不是这种情况,那么为这些专用对象创建不同的存储库和服务就不会很痛苦。

于 2012-09-26T16:10:28.530 回答