我目前正在开发Spring Roo / JPA应用程序,最近我转而使用基于JPA继承的域名模型 。总结我的域模型,我有一个抽象的Member
实体,它由两个实体子类化:Male
和Female
。
在我的所有Spring MVC控制器中,我想避免总是注入两个服务依赖项(一个用于处理Male
个实体,另一个用于Female
个实体)。我宁愿有一个MemberService
服务(连同相应的MemberRepository
),它会返回Male
个实例或Female
个实例。
以上是否可以使用Spring Roo注释,例如:
@RooService(domainTypes = { Member.class })
或那个:@RooJpaRepository(domainType = Member.class)
?例如,这个Member findByEmail(String email);
是否会将 投射 的对象返回到Female
或Male
类型?
更一般地说,在Spring控制器和Spring服务级别处理实体继承的最佳实践是什么?
答案 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逻辑的意义,当我说我的意思是,在这种情况下,例如,你可以解决问题如果男性和女性具有相同的属性,则称为性别属性;如果不是这种情况,那么为那些专门的对象创建不同的存储库和服务就不会那么痛苦。