2012-04-10 3 views
2

Я использую аннотации JPA и когда у меня есть отношение OneToMany - ManyToOne, когда я вижу свою сущность в ManyToOne, joinColumn всегда имеет нулевое значение.Как реализовать ручное отношение JPA OneToMany

Далее я покажу мой пример, у меня есть продукт:

@Entity 
    @Table(name = "PC_PRODUCT") 

    public class Product extends LaunchEntity { 

    private static final long serialVersionUID = 1L; 

    @XmlElement(name = "Product_Name", required = true) 
    protected String productName; 

    @XmlElement(name = "Product_Description") 
    protected String productDescription; 

    @XmlElement(name = "Product_To_Charge") 
    @OneToMany(mappedBy = "product", cascade=CascadeType.MERGE) 
    protected List<ChargeRelation> productToCharge; 

И это мой ChargeRelation класс:

@Entity 
@Table(name="PC_CHARGE_RELATION") 
public class ChargeRelation 
    extends RelationEntity 
{ 

    private static final long serialVersionUID = 1L; 

    @XmlElement(name = "Charge", required = true) 
    @OneToOne(cascade = CascadeType.MERGE) 
    protected Charge charge; 

    @XmlTransient 
    @ManyToOne(cascade=CascadeType.MERGE) 
    @JoinColumn(name="PRODUCT_ID") 
    protected Product product; 

Я читаю файл XML, конвертировать данные для string, сделайте unmarshall для моего объекта root и сохраните этот объект.

Проблема заключается в том, когда я нашел обвинение отношения в моей строке, значения вставляются на отношения таблицызаряда, но колонка с product_id всегда нуль.

У меня есть все сеттеры и геттеры. Как я могу заставить это сделать ручную вставку? спасибо

ответ

2

Примечание: Я EclipseLink JAXB (MOXy) свинца и член группы экспертов JAXB 2 (JSR-222).

EclipseLink JAXB (MOXy) имеет расширение под названием @XmlInverseReference, которое позволяет вам отображать обратную указатель.

Продукт

@Entity 
@Table(name = "PC_PRODUCT") 
public class Product extends LaunchEntity { 

    @XmlElement(name = "Product_To_Charge") 
    @OneToMany(mappedBy = "product", cascade=CascadeType.MERGE) 
    protected List<ChargeRelation> productToCharge; 

} 

ChargeRelation

@XmlInverseReference аннотаций используется там, где ранее была @XmlTransient. @XmlInverseReference действует как @XmlTransient во время операции маршала и заполняет обратную указатель во время операции без маршала.

@Entity 
@Table(name="PC_CHARGE_RELATION") 
public class ChargeRelation extends RelationEntity { 

    @XmlInverseReference(mappedBy = "productToCharge") 
    @ManyToOne(cascade=CascadeType.MERGE) 
    @JoinColumn(name="PRODUCT_ID") 
    protected Product product; 
} 

Для получения более подробной информации

+0

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

2

Обратите внимание, что поставщик JPA отражает состояние отношения «много-к-одному» отношений при сохранении его в базе данных.

Однако JAXB заполняет только стороны «один-ко-многим» во время разборки XML, поэтому вам необходимо заполнить много-одно сторону вручную после отмены маршрутизации.

Смежные вопросы