2012-09-17 178 views
2

我目前正在开发Spring Roo/JPA应用程序,并且最近我根据JPA继承切换到域模型。总结我的领域模型,我有一个抽象Member实体,该实体被两个实体分类:MaleFemale。我想避免总是注入两个服务依赖关系(一个处理Male实体,另一个处理Female实体)。在所有我的Spring MVC控制器中,我希望避免始终注入两个服务依赖关系(一个处理Male实体,另一个处理Female实体)。我宁愿(具有相应的MemberRepository在一起)有一个MemberService服务,将返回一个Male实例或Female实例。JPA继承,Spring Roo和Spring Data的设计问题JPA

是上述可能使用Spring Roo的注释,比如这一个:

  • @RooService(domainTypes = { Member.class })还是那一个:
  • @RooJpaRepository(domainType = Member.class)

例如,将这个Member findByEmail(String email);返回一个对象,我可以要么在FemaleMale类型?

更普遍,什么是在春天的控制器和Spring服务水平,以应对实体产业的最佳实践?

回答

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 { 
} 

这是假设你的男性和女性对象有不同的责任,因此需要将其在不同的班级分开,在你给他们的名(男,女),我认为他们不不过,我不知道你的商业逻辑,当然这只是一个例子(但你的真正问题有多忠实?)。

继承的想法不仅是为了分享“是”一个后代的共同功能,而且保留了OO逻辑的意义,当我说我的意思是,在这种情况下,例如,你可以用这个问题来解决问题如果男性和女性具有相同的属性,则称为性别;如果情况并非如此,那么为那些专门的对象创建不同的存储库和服务将不痛苦。

+0

感谢卡洛斯。这个解决方案的麻烦是我需要两个服务(男性和女性)在每个处理男性和女性实例的控制器中。此外,我的控制器代码变得丑陋的条件逻辑,以检查我是否需要使用一个或另一个服务... – balteo

+0

我怀疑女性和男性在你的业务中有类似的责任,因为你想在同一个控制器中使用两个,我认为你的解决方案是写一个类的性别属性的成员... –

+0

我想过,但后来我使用继承的功能... – balteo