@Transient vs装饰者

时间:2017-02-14 10:59:31

标签: hibernate jpa design-patterns

我对我的实体建模有点矛盾。

我们有一个实体,大约有6-8个实例变量。其中两个实际上并不存在于数据库中,而只用于进行一些验证或在UI中显示。因此,当我们获取实体时,我们会填充一些外部查找。

现在,根据我的同事之一,其更好的做法是使用装饰器而不是使用@Transient。在某种程度上我同意。因为它澄清了DB所代表的实际模型。

但是它会为某些情况添加额外的样板(例如,对于业务我可以将实体命名为MyEntityBO。但是如果我将它用于UI ...再次名称会有点混乱。

我的问题是,在什么情况下使用@Transient而不是装饰器更好?反之亦然

2 个答案:

答案 0 :(得分:0)

这对于两者都使用实体不是一个好习惯:数据库映射和UI映射。始终考虑单一责任原则。实体应该只负责数据库映射,不再需要。您应该为UI表示创建DTO层。但在这种情况下你也应该创建转换器,它很无聊,我建议使用Mapstruct - http://mapstruct.org。 如果你必须使用@Transient,这是smth出错的第一个迹象,请记住它。祝你好运:)

@Entity
public class User {
   @Id
   Long id;
   String name;
}

public class UserDto{
   Long id;
   String name;
}

public class UserConverter{
   public UserDto toDto(User user) {
      if (user == null) return null;
      UserDto dto = new UserDto();
      dto.setId(user.getId());
      dto.setName(user.getName());
      return dto;
   }

   public User toEntity(UserDto dto){...}  
}

在DTO对象中,您可以创建出于某种目的所需的其他字段或方法

答案 1 :(得分:-1)

使用Decorator Pattern的主要缺点是代码维护可能是一个问题(根据我的经验)。 我强烈建议你选择@Transient。