У меня есть следующая структура классов. Эти классы являются классами гибернации, поэтому я не могу их изменить.

//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>

Но это сопоставление dosent customer.nameParts [0] .name работает, поскольку doser-дозатор знает объект в наборе. есть ли обходной путь.

Если это можно сделать только с помощью специального конвертера, приветствуется подсказка шаблона кода.

2
user918953 30 Авг 2011 в 11:17

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>
0
user918953 1 Сен 2011 в 08:38

Пойти на один уровень глубже. нравится

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

Это работает как обходной путь. Я использовал этот трюк, чтобы заставить его работать в некоторых местах.

0
Sivaramakrishnan Sundaram 30 Авг 2011 в 20:52