我有一个带有JPA注释但没有jaxb注释的jpa实体类:
@Entity
public class Category extends EntityObject {
@Id
private long id;
// getter setter and stuff
}jaxb的所有内容都是在外部xml文件中配置的(因为我们需要对对象进行不同的序列化)。
<xml-bindings package-name="mystuff.category">
<java-types>
<java-type name="mystuff.Category" xml-accessor-type="NONE">
<xml-root-element name="category" />
<java-attributes>
<xml-attribute name="name" java-attribute="name" />
<xml-element name="id2" java-attribute="id" />
</java-attributes>
</java-type>
// morestuff ...当我将一个类别实例传递给xml时,我的问题就开始了。结果显示了一个在xml中没有配置的额外id元素。而且,由于类别(或entityObject)没有jaxb注释,我不明白它从何而来。
<category xsi:type="category" name="Category_3">
<id>1073741951</id>
<id2>1073741951</id2>
</category>当我向moxy-xml显式地添加id的xml元素条目时,我得到一个包含id的元素两次:
<id>10737419511073741951</id>有人能告诉我如何摆脱这个标签吗?它是从哪里来的?
编辑
这里是EntityObject类中与id相关的代码
@MappedSuperclass
public abstract class EntityObject implements Serializable {
private static final long serialVersionUID = 1L;
public abstract long getId();
@Field // a solr annotation
public void setId(long id) {
if (getId() <= 0) {
setID(id);
}
}
protected abstract void setID(long id);发布于 2012-03-16 17:12:22
此问题是由于在子对象id上重写EntityObject上的Category属性造成的。
解决方案#1 - 和都在同一个包中。
假设EntityObject与Category在同一个包中,您可以执行以下操作:
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="mystuff.category">
<xml-schema namespace="http://www.example.com/customer"
element-form-default="QUALIFIED" />
<java-types>
<java-type name="EntityObject">
<java-attributes>
<xml-transient java-attribute="id" />
</java-attributes>
</java-type>
<java-type name="Category" xml-accessor-type="NONE">
<xml-root-element name="category" />
<java-attributes>
<xml-attribute name="name" java-attribute="name" />
<xml-element name="id2" java-attribute="id" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>解决方案#2 - 和都在不同的软件包中。
如果EnityObject和Category在不同的包中,则可以创建第二个外部映射文档:
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="another.pkg">
<xml-schema namespace="http://www.example.com/customer"
element-form-default="QUALIFIED" />
<java-types>
<java-type name="EntityObject">
<java-attributes>
<xml-transient java-attribute="id" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>下面是从多个外部映射文档引导的一些示例代码:
package forum9724475;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import another.pkg.EntityObject;
import mystuff.category.Category;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(1);
List<String> oxm = new ArrayList<String>(2);
oxm.add("mystuff/category/oxm.xml");
oxm.add("another/pkg/oxm.xml");
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, oxm);
JAXBContext jc = JAXBContext.newInstance(new Class[] {Category.class}, properties);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Category category = new Category();
category.setId(1073741951);
marshaller.marshal(category, System.out);
}
}下面是运行演示代码的输出:
<?xml version="1.0" encoding="UTF-8"?>
<category xmlns="http://www.example.com/customer">
<id2>1073741951</id2>
</category>https://stackoverflow.com/questions/9724475
复制相似问题