2012-04-10 4 views
2

Ich verwende JPA-Anmerkungen und wenn ich Beziehung OneToMany - ManyToOne habe, wenn ich meine Entität in der ManyToOne, die JoinColumn immer mit Null-Wert ist.So implementieren Sie manuell JPA-Beziehung OneToMany

Als nächstes werde ich mein Beispiel zeigen, habe ich Produkt:

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

Und das ist mein ChargeRelation Klasse:

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

ich eine XML-Datei lese, konvertieren Daten für eine string, mach unmarshall für mein Wurzelobjekt und behalte dieses Objekt bei.

Das Problem ist, wenn ich eine Ladung Beziehung in meinem String gefunden, werden die Werte auf dem Tisch Ladungs ​​Relation eingefügt aber die Säule mit dem product_id ist immer null.

Ich habe alle Setter und Getter definiert. Wie kann ich dies erzwingen, um den manuellen Einsatz zu machen? danke

Antwort

2

Hinweis: Ich bin das EclipseLink JAXB (MOXy) Blei und Mitglied der JAXB 2 (JSR-222) Expertengruppe.

EclipseLink JAXB (MOXy) hat eine Erweiterung namens @XmlInverseReference, mit der Sie den Rückwärtspfeil zuordnen können.

Produkt

@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

Die @XmlInverseReference Anmerkung verwendet wird, wo Sie zuvor @XmlTransient hatte. @XmlInverseReference verhält sich während der Marshal-Operation wie @XmlTransient und füllt den Zurückzeiger während einer Unmarshal-Operation.

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

Weitere Informationen

+0

ich es versuchen, aber hat nicht funktioniert. Ich mache eine rekursive Methode, um alle Beziehungen zu machen. jetzt geht es :) –

2

Beachten Sie, dass JPA-Anbieter den Status der Viele-zu-eins-Beziehung beim Speichern in der Datenbank widerspiegelt.

Allerdings befüllt JAXB nur One-to-Many-Seiten mit XML-Unmarshalling, daher müssen Sie die Many-to-One-Seite manuell nach dem Unmarshalling ausfüllen.