あなたはこのユースケースのため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
のようなものに見えるように変更されるだろう:私たちのXmlAdapter
にEntityManager
のインスタンスを設定する
今 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);
は 'streamId' =' Target.id'です? –
はい、混乱のために申し訳ありません、私の悪い。 –