【问题标题】:Dozer mapping non-Generic Collections to propertiesDozer 将非通用集合映射到属性
【发布时间】:2011-11-06 13:52:11
【问题描述】:

我有一些类结构如下。这些类是休眠类,所以我无法更改它们。

//assume all getters & setters are present 
public class Order{ 
    private Customer customer; 
} 

public class Customer{ 
    // non generics set 
    private Set nameParts; 
} 

public class NamePart{ 
    private String id; 
    private String name; 
}

// target class
public class OrderShippingDetail{ 
    private String firstName; 
} 

映射文件

<mapping> 
    <class-a>Order</class-a> 
    <class-b>OrderShippingDetail</class-b> 
    <field> 
        <a>customer.nameParts[0].name</a> 
        <b>firstName</b> 
    </field> 
</mapping>

但是这种 customer.nameParts[0].name 映射的工作原理是推土机知道集合中的对象。有什么解决办法吗?

如果这只能通过自定义转换器完成,请提供示例代码模板提示。

【问题讨论】:

  • 所以您尝试将集合 nameParts 中的第一个元素映射到 firstName?集合是无序的,所以 nameParts 中的第一个元素并不总是相同的......
  • 是的,我知道,但最初的开发人员留下了 set,它只有一个元素,就是整个客户名称(不仅仅是一部分)。基本上我想访问该集合中存在的任何一个元素。

标签: java hibernate collections dozer object-object-mapping


【解决方案1】:

更深一层。像这样

<mapping> 
    <class-a>Order</class-a> 
    <class-b>OrderShippingDetail</class-b> 
    <field> 
        <a>customer.nameParts[0]</a> 
        <b>this</b> 
    </field> 
</mapping>

<mapping>
    <class-a>{class of object @ nameparts[0]}</class>
    <class-b>OrderShippingDetail</class-b>
    <field><a>name</a><b>firstname</b></field>
</mapping>

这是一种解决方法。我已经使用这个技巧让它在某些地方工作。

【讨论】:

  • 我不知道 this 在映射过程中做了什么。你能解释一下或给出一个链接吗?
【解决方案2】:

我浏览了文档,发现对于深度映射期间的非通用集合,可以使用指定对象

<field> 
    <a>customer.nameParts[0].name</a> 
    <b>firstName</b> 
    <a-deep-index-hint>com.example.Customer, com.example.NamePart</a-deep-index-hint>
</field>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多