在模型和DTO之间映射对象时出现问题

时间:2015-05-01 20:48:49

标签: java model dto

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

@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;

1 个答案:

答案 0 :(得分:0)

有两种不同的方法可供选择,但它们需要进行一些改变。我将在前言中说我尚未处于转换为DTO的情况(即使我正在进行深度递归转换)是瓶颈。即使您的性能要求或您的规模如此之大以至于它确实成为瓶颈,我个人也会建议将工作划分到多个服务器上,然后才开始担心性能下降到详细程度。此外,它似乎效率低,但性能很少直观,你确认这种转换是瓶颈吗?

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

第二种方法是不返回帐户本身,而是将它们转换为ID。在此方法中,您的AccountTypeDTO将使用Set<Integer> accountIds而不是Set<AccountDTO> accounts。但是,这仅适用于您的客户并不总是需要对每个帐户进行操作的情况。