【问题标题】:Make a field of an embeddable class transient from the embedding class in JPA从 JPA 中的嵌入类中创建一个可嵌入类的字段瞬态
【发布时间】:2012-09-20 14:40:00
【问题描述】:

我有以下一组课程

@Embeddable
public class SharedClass {
    ...
    private String legacyField;
    ...
}

@Entity
public class LongStandingEntity {
    ...
    private SharedClass sharedClass;
    ...
}

legacyfield 在旧对象中存储一些过时的数据,但不会为新对象收集。但是我确实需要能够继续访问旧数据。

我正在创建一个也使用SharedClass的新实体

@Entity
public class NewEntity {
    ...
    private SharedClass sharedClass;
    ...
}

它不需要legacyField,我想避免在数据库中为其添加一列,同时保持LongStandingEntity 的映射工作。

这可以通过 JPA 注释实现吗?

【问题讨论】:

  • 你想永远不存储还是不存储在新实体中?
  • 我刚刚澄清了这一点。我需要它用于旧的而不是新的

标签: java hibernate jpa orm annotations


【解决方案1】:

我不记得有什么特定的注释可以帮助你。我还是宁愿在这种情况下采取设计方法。如果您有仅属于某个类的字段,请将它们分隔在另一个仅与旧数据相关联的可嵌入类中。

对我来说似乎是一种更简洁的方法,只是为了保持实体的明显区别。

【讨论】:

  • 我已经澄清了我的问题:我需要保持映射适用于旧实体 - 而不是新实体。
  • @scarba05 酷,我已经编辑了我的答案。恕我直言,不是特别要求什么,而是一个选项。
【解决方案2】:

我发现的一种解决方法是使用参数 insertable=false 和 updatable=false 覆盖关联。

@Entity
public class NewEntity {
    ...
    @Embedded
    @AssociationOverride(name = "legacyField", joinColumns = @JoinColumn(insertable = false, updatable = false))
    private SharedClass sharedClass;
    ...
}

【讨论】:

  • 对我不起作用,而是用@AttributeOverride(name = "legacyField", column = @Column(insertable = false, updatable = false)) 解决了这个问题
【解决方案3】:

我解决了以下问题

@Entity
public class NewEntity {
    ...
    @AttributeOverrides({
        @AttributeOverride(name = "legacyField", column =  @Column(insertable = false, updatable = false))
    })
    @Embedded
    private SharedClass sharedClass;
    ...
}

更新 但是当阅读实体时,我得到了 错误:列 new_entity_.legacyField 在字符 1504 处不存在

所以问题没有解决

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2010-09-24
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多