JPA 仅使用 PK 持久化

Posted

技术标签:

【中文标题】JPA 仅使用 PK 持久化【英文标题】:JPA-persisting using PK only 【发布时间】:2013-01-02 04:45:34 【问题描述】:

我有一个控制数据 DB-TABLE 实体

@Table(name = "A")
class A 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)   
    @Column(name = "A_OID")
    private Long pk;

和一个引用上述 DB-TABLE 和其他一些的 DB-VIEW 实体

@Table(name = "A_VIEW")
class ARef 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)   
    @Column(name = "A_OID")
    private Long pk;

    private String value;

其中一些value 加入其中。pk 指的是同一行。如何保存我的实体B,引用ARef,使用A,类似这样:

class B 
    public ARef a;


A a = em.find(A.class, pk);
B b = new B();
b.a = a; // How to do this? Using pk somehow?

还有更多,所以不能简单地改用ARef a = em.find(ARef.class, pk);

我知道 OpenJPA 中有某种类型的“原生 SQL”支持,但那太低级了。

【问题讨论】:

JPA 不定义/允许直接更新来自其他类的实体字段(仅通过设置器)。显然,一些 JPA 提供者可能支持它(例如 DataNucleus JPA 支持),但很多不支持。 【参考方案1】:

如果您想使用“b.a”进行实例化,首先应将 ARef 更改为 public。

class B 
    public ARef a;


A a = em.find(A.class, pk);
B b = new B();
b.a = a;

回到问题.. 我使用将引用作为参数从控制器类传递给视图类

像这样:

A a = new A();
ARef aref = new ARef(a);

【讨论】:

很抱歉,但这并不能解决问题(我本来可以做一个em.find(ARef.class)),我需要立即管理对象,性能至关重要。 我明白了.. 抱歉,我帮不上忙。希望你解决了问题

以上是关于JPA 仅使用 PK 持久化的主要内容,如果未能解决你的问题,请参考以下文章

JPA - 持久化对象时何时使用 getTransaction()

如何使用 JPA 持久化 LocalDate?

JPA规范及其它持久层框架

如何使用 JPA 获取最后一个持久化实体的 ID

什么框架持久化,openshift + mongodb,jpa

使用 JPA 在 PostgreSQL 中持久化 UUID