【问题标题】:Hibernate mapping: ignore a super class fieldHibernate 映射:忽略超类字段
【发布时间】:2015-07-05 19:57:41
【问题描述】:

我有 A 类和 B 类

public class A{
int f1;
int f2;
int f2;
}

public class B extends A{
}

我的问题是如何忽略映射到 B 的表中的字段,例如“f2”?

【问题讨论】:

  • 你使用的是哪种继承策略??每个类的表,每个子类的表或每个具体类的表..??
  • 你读过瞬态吗?

标签: java hibernate orm hibernate-mapping


【解决方案1】:

假设我对您的帖子所做的编辑已获批准,我将尝试回答。 在下面的代码中,我使用 AttributeOverride 忽略了 A 类(即 B 的超类)中的字段 f2。

@Entity
@AttributeOverride(name = "f2", column = @Column(name = "f2_col", insertable = false, updatable = false)
public class B extends A{
}

如果您想进一步了解它,请参阅AttributeOverride

使用insertable = falseupdatable = false 的AttributeOverride 应该会有所帮助,但这也取决于您的继承策略。它只是有助于使映射字段从超类瞬态继承,以便其他一些子类可以使用它,但对于这个特定的子类,它将被忽略。

【讨论】:

  • @Amir 谢谢 .. 编辑已获批准 .. 让我知道该解决方案是否适合您..
  • 这只是为数据库表中的列提供不同的名称,但问题是如何忽略它,类似于使用瞬态变量。
  • @Chaitanya 谢谢.. 但假设子类和超类都已映射,并且您想忽略子类中的 f2 值.. AttributeOverride 与 insertable = false,可更新= false 应该有所帮助..但这也取决于您的继承策略..它只是有助于使映射字段从超类瞬态继承..以便其他一些子类可以使用它,但它会忽略这个特定的子类..如果我的理解有误,请告诉我..
  • 感谢您的解释,现在对我来说很有意义:)
  • 但是即使你用false标记一个字段insertableupdatable,Hibernate也会在Select语句中期望这样的列!!! ……不是吗?所以不是真的transient
【解决方案2】:

如果您想有条件地将字段应用于子类,也许您应该重新设计您的类,使它们看起来像这样

public abstract class MyAbstractClass {
    // ...  
}

public class A extends MyAbstractClass {
    int f1;
}

public class B extends MyAbstractClass {
    int f2;
}

假设您使用 Hibernate 将其应用于数据库表映射,您可以在 MyAbstractClass 上使用 @MappedSuperclass 在 A 和 B 上使用 @Entity - 希望它有所帮助。

【讨论】:

  • 非常感谢你指向@MappedSuperclass,你让我开心!
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 2020-10-26
  • 2020-04-24
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
相关资源
最近更新 更多