JPA继承,Spring Roo和Spring Data JPA的设计问题

时间:2012-09-17 08:52:28

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

我目前正在开发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服务级别处理实体继承的最佳实践是什么?

1 个答案:

答案 0 :(得分: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逻辑的意义,当我说我的意思是,在这种情况下,例如,你可以解决问题如果男性和女性具有相同的属性,则称为性别属性;如果不是这种情况,那么为那些专门的对象创建不同的存储库和服务就不会那么痛苦。