Naf*_*Kay 4 java xml hibernate 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注释中执行此操作而不修改我的模型?
您可以使用XmlAdapterfor这个用例:
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登记在Dependency使用类@XmlJavaTypeAdapter注释:
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;
    }
}
走得更远
Target我们可以使用an EntityManager从数据库中查询相应的实例,而不仅仅是创建一个新实例.我们XmlAdapter将改为看起来像:
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;
    }
}
现在要设置EntityManager我们的实例XmlAdapter,我们可以执行以下操作:
Unmarshaller umarshaller = jaxbContext.createUnmarshaller();
TargetAdapter targetAdatper = new TargetAdapter(entityManager);
unmarshaller.setAdapter(targetAdapter);
| 归档时间: | 
 | 
| 查看次数: | 3058 次 | 
| 最近记录: |