【问题标题】:Insert/Update of XMLType with JPA使用 JPA 插入/更新 XMLType
【发布时间】:2012-07-01 13:05:05
【问题描述】:

我有一个带有 XMLType 列的 oracle 数据库。我已经为它实现了一个 DescriptorCustomizer,并且我在实体中使用 XMLType 作为我的字段类型。

基本上我有:

@Entity
@Customizer(XmlCustomizer.class) 
public class ...... {
    .....
private XMLType xmlColumn;
    .....
}

这一切都非常适合从数据库中读取数据。但是当谈到持久化数据时,我不知道该怎么做。我还没有找到一种简单的方法来创建一个包含 xml 的 XMLType 对象。大多数方法似乎都要求一个非常丑陋的连接。那么我错过或误解了什么?

谢谢。

编辑:我忘了提到我确实让它与 XMLType 一起工作,但就像我说的那样,我必须将一个连接传递给我可以从我的 EntityManager 获得的数据库。不过看起来很丑。

【问题讨论】:

  • 将对象序列化为数据库作为 BLOB 是否是一种解决方案?

标签: oracle jpa oracle11g jpa-2.0 eclipselink


【解决方案1】:

XMLType 是 Oracle JDBC 类型,因此可能不是对象的最佳字段类型。

您可以将其映射到字符串或 DOM 文档,然后您可以编写它。

【讨论】:

  • 我的理解是,如果我将其转换为字符串或 DOM 文档,会极大地影响性能。我正处于学习 JPA 如何工作以及 Oracle XMLType 对象如何工作的早期阶段,但我相信如果我有延迟提取,如果我使用提供的方法提取元素,XMLType 对象只会根据需要提取元素。
  • 这取决于您的 xml 文档有多大。您可以使属性 LAZY,因此仅在访问时才获取它。如果您想直接使用该类型,您可以使用 unwrap() 从 EntityManager 获取 JDBC 连接
  • 我能够让我的 DescriptorCustomizer 很好地适用于 XMLType,但我从来没有让它适用于 String 或 Document。 XMLType 允许我获取一个 Document 对象,所以它还不错。是的,我打算使用一个惰性提取器。由于我使用的是 Resin,因此我确实使用此代码 java.sql.Connection conn = ((com.caucho.sql.UserConnection) entityManager.unwrap(java.sql.Connection.class)).getDriverConnection() 使连接正常工作。看起来很丑,但在这一点上我只想让它工作。
  • 延迟提取不适用于列。考虑将 lob/blob 移动到另一个表,并将这种 1 对 1 关系设置为惰性。
【解决方案2】:

最新的 EclipseLink (2.4) 似乎将 XMLType 直接转换为 String 而无需定制器。

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 2012-08-19
    • 2015-02-08
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2022-06-22
    • 1970-01-01
    相关资源
    最近更新 更多