如何通过JPA将二进制XML插入Oracle表?遵循Oracle 12c存储规范
二进制XML结合JPA插入Oracle 12c+ 实操方案
前置准备
- 引入匹配Oracle版本的JDBC驱动(推荐ojdbc8及以上版本)
- JDK 8自带JAXB,JDK 9+需单独引入JAXB相关依赖
步骤1:补全实体类定义
原有实体类缺少getter、setter和构造方法,补全后如下:
@Entity public class XMLentity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Lob @Column(name = "MYXML", columnDefinition = "XMLType") private byte[] xml; // 空构造方法(JPA必填) public XMLentity() {} // 带参数构造方法方便赋值 public XMLentity(byte[] xml) { this.xml = xml; } // 此处补全所有字段的getter、setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } public byte[] getXml() { return xml; } public void setXml(byte[] xml) { this.xml = xml; } }
Fruit实体类保持原有定义即可,同样补全getter、setter和空构造方法。
步骤2:编写Fruit转二进制XML的工具方法
直接通过JAXB将对象序列化为字节数组,避免转字符串再编码的格式损耗,符合Oracle二进制XML存储要求:
public class XmlConvertUtil { // 将Fruit对象转换为符合Oracle二进制XML存储要求的字节数组 public static byte[] fruitToBinaryXml(Fruit fruit) throws Exception { JAXBContext jc = JAXBContext.newInstance(Fruit.class); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false); marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); // 输出到字节数组流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(fruit, baos); return baos.toByteArray(); } }
步骤3:建表确认存储格式
创建表时需指定XMLType字段的存储格式为二进制,避免使用废弃的CLOB存储:
CREATE TABLE xml_entity ( id NUMBER(19) GENERATED ALWAYS AS IDENTITY PRIMARY KEY, myxml XMLTYPE ) XMLTYPE COLUMN myxml STORE AS BINARY XML;
步骤4:JPA保存逻辑
Spring Data JPA场景
- 定义Repository接口
public interface XMLentityRepository extends JpaRepository<XMLentity, Long> { }
- 业务调用示例
@Service public class XmlService { @Autowired private XMLentityRepository repository; public void saveFruitAsXml(Fruit fruit) throws Exception { byte[] binaryXml = XmlConvertUtil.fruitToBinaryXml(fruit); XMLentity entity = new XMLentity(binaryXml); repository.save(entity); } }
原生JPA场景
直接用EntityManager调用persist方法即可,逻辑一致。
测试验证
改造原有Demo类的main方法即可测试:
public class Demo { public static void main(String[] args) throws Exception { // 构造Fruit对象(也可以从XML文件解析得到) Fruit fruit = new Fruit(); fruit.setId(1); fruit.setName("苹果"); fruit.setPrice("6.99"); // 转二进制XML byte[] binaryXml = XmlConvertUtil.fruitToBinaryXml(fruit); // JPA保存,替换为自己的JPA初始化逻辑即可 EntityManagerFactory emf = Persistence.createEntityManagerFactory("your-persistence-unit-name"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); em.persist(new XMLentity(binaryXml)); em.getTransaction().commit(); em.close(); emf.close(); } }
注意事项
- 不要将XML转成String再存入数据库,会导致二进制存储格式失效,默认使用废弃的CLOB存储
- 确保persistence.xml或者项目配置文件中的JPA数据库方言配置为Oracle方言
内容的提问来源于stack exchange,提问作者Nikolay Grigoryev
相关产品推荐
相关产品推荐

