2011-09-02 11 views
4

は、私はこの効果に何か持っている:IDを使用してJAXBオブジェクトをシリアライズしますか?私のデータモデルで

@Entity 
public class Target { 

    @Id 
    @GeneratedValue 
    private Long id; 

    /* ...etc... */ 
} 

@Entity 
public class Dependency { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne(optional=false) 
    @Column(name="target_id") 
    private Target target; 

    /* ...etc... */ 
} 

を私はすでにうまくTargetをシリアル化するんだけど、私はDependencyをシリアル化する必要があります。基本的に、私は必要なのは、このようなものです:

<dependency> 
    <id>100</id> 
    <targetId>200</targetId> 
</dependency> 

は私のモデルを変更することなく、JAXB注釈でこれを行う方法はありますか?

+0

は 'streamId' =' Target.id'です? –

+0

はい、混乱のために申し訳ありません、私の悪い。 –

答えて

7

あなたはこのユースケースのためXmlAdapterを使用することができます。

package forum7278406; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class TargetAdapter extends XmlAdapter<Long, Target> { 

    @Override 
    public Long marshal(Target target) throws Exception { 
     return target.getId(); 
    } 

    @Override 
    public Target unmarshal(Long id) throws Exception { 
     Target target = new Target(); 
     target.setId(id); 
     return target; 
    } 

} 

XmlAdapterは、@XmlJavaTypeAdapter注釈を使用してDependencyクラスに登録されています。

package forum7278406; 

import javax.persistence.*; 
import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@Entity 
@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Dependency { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne(optional=false) 
    @Column(name="target_id") 
    @XmlJavaTypeAdapter(TargetAdapter.class) 
    private Target target; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Target getTarget() { 
     return target; 
    } 

    public void setTarget(Target target) { 
     this.target = target; 
    } 

} 
さらに

代わりに、ちょうど私たちは、データベースから対応するインスタンスを照会するEntityManagerを使用することができTargetの新しいインスタンスを作成するので行く


。私たちのXmlAdapterのようなものに見えるように変更されるだろう:私たちのXmlAdapterEntityManagerのインスタンスを設定する

package forum7278406; 

import javax.persistence.EntityManager; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class TargetAdapter extends XmlAdapter<Long, Target> { 

    EntityManager entityManager; 

    public TargetAdapter() { 
    } 

    public TargetAdapter(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

    @Override 
    public Long marshal(Target target) throws Exception { 
     return target.getId(); 
    } 

    @Override 
    public Target unmarshal(Long id) throws Exception { 
     Target target = null; 
     if(null != entityManager) { 
      target = entityManager.find(Target.class, id); 
     } 
     if(null == target) { 
      target = new Target(); 
      target.setId(id); 
     } 
     return target; 
    } 

} 

を、私たちは、次の操作を実行できます。

Unmarshaller umarshaller = jaxbContext.createUnmarshaller(); 
TargetAdapter targetAdatper = new TargetAdapter(entityManager); 
unmarshaller.setAdapter(targetAdapter); 
+1

これは勝ちです。 –

2

それはXmlIDとXmlIDRefでEclipseLinkのMOXYのために動作します(ただし、XmlIDは文字列でなければならない日JAXB、ために失敗した)

@Entity 
@XmlRootElement 
public class Target { 
    @Id 
    @GeneratedValue 
    @XmlID 
    @XmlElement 
    private Long id; 
} 


@Entity 
@XmlRootElement 
public class Dependency { 

    @Id 
    @GeneratedValue 
    @XmlElement 
    private Long id; 

    @ManyToOne(optional = false) 
    @Column(name = "target_id") 
    @XmlIDREF 
    @XmlElement(name = "targetId") 
    private Target target; 
} 
関連する問題