【问题标题】:Using POJO as a base for hibernate entity使用 POJO 作为休眠实体的基础
【发布时间】:2020-08-22 09:52:08
【问题描述】:

我最近开始使用 Java 进行开发,我的客户也是一名开发人员,自 Java 发布以来一直在使用 Java 进行开发。

所以当他说“我们有充分的理由不在我们的项目中使用瞬态字段”时,我没有问这些原因是什么。但是,回到问题:

我有两个班级:

  1. POJO,仅用于生成 JSON:
public class BaseSector implements Serializable {

    private String id;

    private String name;

    private String parentId;
  1. 实体:
public class Sector {

    @Column(length = 36)
    private String id;

    @Column(length = 40)
    private String name;

    @Column(length = 36)
    private String parentId;
//  ... Bunch of other fields

Entity 类有没有办法扩展这个 POJO,并动态添加 Column 注释?还是将 POJO 作为接口?还是在 POJO 构造函数中使用实体类?

之前我们有这样的事情:

for (Sector sector : sectors) {
    BaseSector baseSector = new BaseSector();
    baseSector.setId(sector.getId());
    baseSector.setName(sector.getName());
    baseSector.setParentId(sector.getParentId());
}

但是我通过在 HQL 构造函数中使用 BaseSector 来改变它...... 顺便说一句,我们还有 SectorInfo 和 SimpleSectorInfo,它们也扩展了 BaseSector,但这是一个不同的主题..

【问题讨论】:

标签: java hibernate hibernate-mapping


【解决方案1】:

TRANSIENT 字段告诉您的 ENTITY 类,该特定字段不应保存在数据库中。 @Transient 注释用于忽略字段以不保留在 JPA 中的数据库中,其中 transient 关键字用于忽略序列化中的字段。 @Transient注解的字段仍然可以被序列化,但transient关键字声明的字段不能被持久化,也不能被序列化。

一个 POJO 可以被一个实体扩展,反之亦然。这在 JPA 规范中有说明。您可以在以下链接中找到更多示例:

Link:1 : JPA Non-Entity SuperClass

Link 2 : JPA Specification

您可以通过使用注释来实现这一点:@javax.persistence.MappedSuperclass

它指出:如果在类级别上没有使用与映射相关的注解(例如 @Entity 或 @MappedSuperclass),则超类被视为非实体类。

这意味着如果您不在超类中使用上述注释,您的超类将在此处被视为非实体类。

如何构造类:

SUPERCLASS 这也是您的 JSON 对象的 POJO

@MappedSuperclass
public class BaseSector implements Serializable {

    private String id;
    private String name;
    private String parentId;

}

ENTITY 类:

@Entity
@Table(name = "sector")
public class Sector extends BaseSector {
    @Column(length = 36)
    private String id;

    @Column(length = 40)
    private String name;

    @Column(length = 36)
    private String parentId;

    //  ... Bunch of other field

}

您还可以覆盖 BaseSector 在您的 ENTITY - Sector 中定义的某些属性 你需要使用

 @AttributeOverride   // for single property
 @AttributeOverrides  // override more than one property

【讨论】:

  • 我对瞬态关键字(和注释,但我想使用瞬态关键字)有点熟悉,但感谢您的重述。你能解释一下为什么使用它们是一种不好的做法吗?我想我们可能不想为了将 3 个属性导出到 json 中而实例化较重的实体类?另一方面,在两个类中具有相同的属性,使用 getter 和 setter 是我想避免的事情......也许将 BaseSector 作为一个实体类并在 Sector 中扩展它会很好,但是会不会有冲突对象应该只做一件事的原则?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多