Inheritance JPA继承、Spring Roo和Spring数据JPA的设计问题

Inheritance JPA继承、Spring Roo和Spring数据JPA的设计问题,inheritance,jpa,spring-roo,spring-data-jpa,Inheritance,Jpa,Spring Roo,Spring Data Jpa,我目前正在开发一个SpringRoo/JPA应用程序,最近我切换到一个基于JPA继承的域模型。总结一下我的领域模型,我有一个抽象的成员实体,它由两个实体子类:男性和女性 在我所有的SpringMVC控制器中,我希望避免总是注入两个服务依赖项—一个处理男性实体,另一个处理女性实体。我希望有一个MemberService服务和一个相应的MemberRepository,它将返回一个男性实例或女性实例 使用Spring Roo注释(如此注释)是否可以实现上述功能: @RooServicedomainT

我目前正在开发一个SpringRoo/JPA应用程序,最近我切换到一个基于JPA继承的域模型。总结一下我的领域模型,我有一个抽象的成员实体,它由两个实体子类:男性和女性

在我所有的SpringMVC控制器中,我希望避免总是注入两个服务依赖项—一个处理男性实体,另一个处理女性实体。我希望有一个MemberService服务和一个相应的MemberRepository,它将返回一个男性实例或女性实例

使用Spring Roo注释(如此注释)是否可以实现上述功能:

@RooServicedomainTypes={Member.class}或该类型: @RooJParePositionDomainType=Member.class? 例如,该成员是否会发现DbyMailString电子邮件;返回一个可以强制转换为女性或男性类型的对象


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

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

你会得到:

@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的属性来解决问题;如果不是这样的话,那么为这些专用对象创建不同的存储库和服务将不会很痛苦

谢谢卡洛斯。这个解决方案的问题是,我需要在每个控制器中提供两个服务,分别处理男性和女性实例。此外,我的控制器代码因条件逻辑而变得丑陋,以检查我是否需要使用其中一项或另一项服务…我怀疑女性和男性在您的业务中有类似的责任,因为您希望在同一控制器中使用这两项服务,我认为你的解决方案是写一个带有性别属性的类成员…@balteo我认为Carlos是在要求你重新考虑是否需要继承。如果使用sex属性,则不需要继承。例如,如果你正在开发一个约会应用程序,并且男女之间存在显著差异,那么遗传可能是相关的
@RooService(domainTypes = { Male.class })
public interface MaleService {
}

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