【问题标题】:How to make a mapped field inherited from a superclass transient in JPA?如何使映射字段继承自 JPA 中的超类瞬态?
【发布时间】:2010-10-24 11:08:32
【问题描述】:

我有一个无法更改的旧架构。我正在使用通用功能的基类,它包含一个嵌入式对象。有一个字段通常映射在嵌入对象中,它只需要在一个(许多)子类的持久性 ID 中。我创建了一个包含它的新 id 类,但随后我收到该字段被映射两次的错误。下面是一些示例代码,为了保持读者的理智而大大简化了:

@MappedSuperclass
class BaseClass {
    @Embedded
    private Data data;
}

@Entity
class SubClass extends BaseClass {
    @EmbeddedId
    private SubClassId id;
}

@Embeddable
class Data {
    private int location;

    private String name;
}

@Embeddable
class SubClassId {
    private int thingy;

    private int location;
}

我已经尝试过@AttributeOverride,但我只能让它重命名该字段。我尝试将其设置为可更新 = 假,可插入 = 假,但这在 @AttributeOverride 注释中使用时似乎不起作用。有关此问题的解决方案,请参见下面的答案。

我意识到我可以更改基类,但我真的不想拆分嵌入对象以分隔共享字段,因为这会使周围的代码更加复杂并且需要一些丑陋的包装代码。我也可以为这种极端情况重新设计整个系统,但我真的不想这样做。

我使用 Hibernate 作为我的 JPA 提供程序。

【问题讨论】:

    标签: java database orm jpa mapping


    【解决方案1】:

    我找到了 AttributeOverride 不起作用的原因。注释类时,您必须在名称字段中包含嵌入对象的标识符。我正在这样做:

    @Entity
    @AttributeOverride(name = "location", column = @Column(name = "location", insertable = false, updatable = false)
    class SubClass extends BaseClass {
    

    什么时候需要这样:

    @Entity
    @AttributeOverride(name = "data.location", column = @Column(name = "location", insertable = false, updatable = false)
    class SubClass extends BaseClass {
    

    奇怪的是,更改@Column 的名称字段确实适用于第一个版本,但可插入和可更新字段被忽略了。我不知道这是 JPA 规范的错误还是微妙之处。

    无论如何,这确实解决了如何将字段设置为只读,但它没有回答原始问题:是否可以从映射的超类中创建字段瞬态?

    【讨论】:

    • 我知道这已经 6 岁了,但你有没有找到解决这个问题的方法?和/或记得它是什么?
    • @EricB。抱歉,从未找到不继承映射字段的方法。我认为不可能做到这一点。我认为他们可能会认为这就像试图降低 Java 中继承方法的可见性 - 所以只是违反规则。就我而言,我在拐角处工作,这有点难看,但这是唯一的选择。
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多