【问题标题】:Problems in mapping objects between the model and DTO模型和DTO之间映射对象的问题
【发布时间】:2015-05-01 20:48:49
【问题描述】:

我正在以下模型之间进行映射:

@Entity
@Table(name="account_type")
@NamedQuery(name="AccountType.findAll", query="SELECT a FROM AccountType a")
public class AccountType implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name="account_type_id")
    private Integer accountTypeId;

    @Column(name="account_type_code")
    private String accountTypeCode;

    @OneToMany(mappedBy="accountType")
    private Set<Account> accounts;

其中有一组Account:

@Entity
@NamedQuery(name="Account.findAll", query="SELECT a FROM Account a")
public class Account implements Serializable {
    private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
@Column(name="account_id")
private Integer accountId;

@Column(name="account_number")
private String accountNumber;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="account_type_id_fk")
private AccountType accountType;

还有他们的DTO。

我在映射 Account 等复杂类型时遇到问题:

public static Account getAccount(AccountDTO dto) {
        Account model = new Account();
        
        model.setAccountId(dto.getAccountId());
        model.setAccountNumber(dto.getAccountNumber());
        
        model.setAccountType(dto.getAccountType());
        // Error: can't convert from AccountypeDTO to AccountType

        return model;
    }

它给出了一个错误,它无法从AccountypeDTO 转换为AccountType

所以我做了以下事情:

model.setAccountType(getAccountType(dto.getAccountType()));

getAccountType 方法在哪里:

public static AccountType getAccountType(AccountTypeDTO dto) {
        
        AccountType model = new AccountType();

        model.setAccountTypeId(dto.getAccountTypeId());
        model.setAccountTypeCode(dto.getAccountTypeCode());

        model.setAccounts(dto.getAccounts());
        // Now here again a similar error
    }

我认为这是一个很深的recursive?如何解决?

我的问题是如何有效地转换它们。

Annex


acountTypeDTO的代码:

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class AccountTypeDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    @NotNull
    @NotEmpty
    private Integer accountTypeId;

    @NotNull
    @NotEmpty
    private String accountTypeCode;

    private Set<AccountDTO> accounts;

AccountDTO的代码:

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class AccountDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    @NotNull
    @NotEmpty
    private Integer accountId;

    @NotNull
    @NotEmpty
    private String accountNumber;

    private AccountTypeDTO accountType;

【问题讨论】:

  • 可以添加AccountTypeDTO的代码吗?
  • @Jens 请看编辑
  • 您的问题是什么?对我来说,AccountDTO 中的accountType 不是AccountType 似乎很明显,因此出现了错误。
  • @RC。我的问题是如何有效地转换它们

标签: java model dto


【解决方案1】:

我想到了两种替代方法,但它们需要进行一些更改。我首先要说的是,我还没有遇到转换为 DTO(即使我正在进行深度递归转换)是瓶颈的情况。即使您的性能要求或规模如此之大以至于它确实成为了瓶颈,我个人还是建议在我开始担心性能下降到那个细节级别之前将工作分配到多个服务器上。此外,它可能似乎效率低下,但性能很少直观,您是否确认这种转换是一个瓶颈?

第一种选择是不使用单独的类作为 DTO。有些方法使用与 DTO 和底层实体相同的类,有些方法使用 DTO 作为父类,实体类作为子类。这将使您不必进行任何类型的 DTO实体转换。有一些缺点,因为这几乎总是最终将两个职责合并到一个类中,并且会使您的代码更复杂且可读性更低。

第二种选择是不返回帐户本身,而是将它们转换为 ID。在这种方法中,您的 AccountTypeDTO 将具有 Set&lt;Integer&gt; accountIds 而不是 Set&lt;AccountDTO&gt; accounts。但是,这仅在您的客户并不总是需要对每个帐户进行操作时才有效。

【讨论】:

  • 感谢您的回答,我想我坚持使用第二个选项,但是除了像 Set&lt;AccountDTO&gt; 这样的复杂类型之外,我没有传递 id 而不是传递所有内容。但有一件事:如果我返回一些值而不返回其他值,在更新实体时,它们将更新为 NULL ??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多