Java 通过其ID序列化JAXB对象?
在我的数据模型中,我有这样的想法:Java 通过其ID序列化JAXB对象?,java,xml,hibernate,jaxb,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
@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>
<id>100</id>
<targetId>200</targetId>
</dependency>
100
200
有没有一种方法可以在JAXB注释中做到这一点而不修改我的模型 它适用于带有XmlID和XmlIDRef的EclipseLink MOXy(但对sun JAXB无效,其中XmlID必须是字符串)
您可以在此用例中使用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;
}
}
更进一步
我们可以使用EntityManager
从数据库中查询相应的实例,而不仅仅是创建Target
的新实例。我们的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;
}
}
是的,对不起,我的错。
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;
}
}
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);