【问题标题】:Design issue with JPA inheritance, Spring Roo and Spring Data JPAJPA 继承、Spring Roo 和 Spring Data JPA 的设计问题
【发布时间】:2012-09-09 11:17:42
【问题描述】:

我目前正在开发一个 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); 是否会返回一个我可以投射FemaleMale 类型的对象?

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

【问题讨论】:

    标签: inheritance jpa spring-roo spring-data-jpa


    【解决方案1】:

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

    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 逻辑的意义,当我说我的意思是,例如,在这种情况下,您可以使用如果男性和女性具有相同的属性,则称为性别的属性;如果不是这种情况,那么为这些专用对象创建不同的存储库和服务就不会很痛苦。

    【讨论】:

    • 谢谢卡洛斯。这个解决方案的问题是我在每个处理男性和女性实例的控制器中都需要两个服务(男性和女性)。此外,我的控制器代码变得丑陋,带有条件逻辑来检查我是否需要使用其中一项服务......
    • 我怀疑女性和男性在您的业务中具有相似的责任,因为您想在同一个控制器中使用两者,我认为您的解决方案是编写一个具有性别属性的类成员......跨度>
    • @balteo 我认为 Carlos 要求您重新考虑是否需要继承。如果您使用性别属性,则不需要继承。例如,如果您正在构建一个约会应用程序,并且两性之间存在显着差异,那么可能继承是相关的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2016-02-01
    • 2012-05-18
    • 2012-12-23
    • 2017-11-29
    • 1970-01-01
    相关资源
    最近更新 更多