Hibernate + Dozer - 在映射的集合项属性上使用map-id

时间:2014-09-24 06:56:41

标签: java hibernate dozer

我有两个休眠实体:

@Entity
@Table(name = DBConstants.TABLE_PARTNER)
public class Partner extends XWeedEntity {

    private static final long serialVersionUID = 5692151244956513381L;

    @Id
    @Column(name = DBConstants.PARTNER_COL_PARTNER_NUMBER)
    private Integer partnerNumber;

    @OneToMany(mappedBy = DBConstants.VISIT_PROP_VISITOR)
    private List<Visit> visits;

    // More fields and properties...
}


@Entity
@Table(name = DBConstants.TABLE_VISIT)
public class Visit extends XWeedEntity {

    private static final long serialVersionUID = -8324746049334117579L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = DBConstants.VISIT_COL_ID)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = DBConstants.VISIT_COL_VISITOR, nullable = false)
    private Partner visitor;

    // More fields and properties...
}

两个DTO实体:

public class PartnerDto extends XWeedEntity {

    private static final long serialVersionUID = 5692151244956513381L;
    private Integer partnerNumber;
    private List<VisitDto> visits;

    // More fields and properties...
}


public class VisitDto extends XWeedEntity {

    private static final long serialVersionUID = -8324746049334117579L;
    private Integer id;
    private PartnerDto visitor;

    // More fields and properties...
}

我有以下推土机映射:

<mapping map-id="partnerWithCollections" map-empty-string="false" map-null="false">
    <class-a>org.xweed.model.app.domain.dbo.Partner</class-a>
    <class-b>org.xweed.model.app.domain.dto.PartnerDto</class-b>

    <field map-id="visitWithPartner">
        <a>visits</a>
        <b>visits</b>
    </field>
</mapping>

<mapping map-id="partnerBasic" wildcard="false" map-empty-string="false" map-null="false">
    <class-a>org.xweed.model.app.domain.dbo.Partner</class-a>
    <class-b>org.xweed.model.app.domain.dto.PartnerDto</class-b>

    <field>
        <a>partnerNumber</a>
        <b>partnerNumber</b>
    </field>
</mapping>

<mapping map-id="visitWithPartner" map-empty-string="false" map-null="false">
    <class-a>org.xweed.model.app.domain.dbo.Visit</class-a>
    <class-b>org.xweed.model.app.domain.dto.VisitDto</class-b>

    <field map-id="partnerBasic">
        <a>visitor</a>
        <b>visitor</b>
    </field>
</mapping>

问题在于,当我使用&#34; partnerWithCollections&#34;来调用dozer时映射,推土机正在映射合作伙伴访问中的所有访问对象,但是每次访问都有访问者访问它的访问权限,等等,每次访问的访问者属性应该只包含partnerNumber。 / p>

如果我尝试将访问者字段排除在访问之外,那么就可以工作,并且每个访问者的访问都是空的,但由于某种原因,使用map-id无法使用某些具体的合作伙伴映射。

有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是因为默认情况下,dozer始终映射具有相同名称的属性:

  • Partner.visits
  • PartnerDto.visits

您可以停用此设置&lt; mapping&gt;属性“wildcard = false”。

来自官方文件:

  

Dozer会自动映射具有匹配属性名称的字段吗?

     

是。具有匹配属性名称的所有字段都是隐式映射的。这将是非典型用法,但您可以通过设置wilcard =“false”来抑制此行为。

http://dozer.sourceforge.net/documentation/faq.html#auto-property-name

您还可以使用全局配置对所有映射执行此操作:

<configuration>
    <wildcard>false</wildcard>
</configuration>

http://dozer.sourceforge.net/documentation/globalConfiguration.html