当前位置: 首页 > 知识库问答 >
问题:

Hibernate-在没有基表注释的情况下扩展实体?

阮才俊
2023-03-14

我有以下2个Hiberante实体:

Person

Animal 

它们有共享字段/列,例如:name、age等,但是每个主键id字段的名称不同,例如有person\u idanimal\u id

@Entity
@Table(name = "person")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person{
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty
    @Column(name = "person_id")
    private Integer person_id;

    // all below fields are generic in all the entities
    @JsonProperty
    @Column(name = "name")
    private String name;

    @JsonProperty
    @Column(name = "age")
    private String age;

}

有没有一种方法可以创建一个基本实体超类来保存这些通用的名称、年龄等字段,然后让Person、Animal和任何新实体扩展这个超实体?

请注意,超级类没有自己的表,所以我不确定@table值会有什么?

我还有一个问题,就是主键并非都被命名,例如,id,因此必须在每个实体中具体指定它们。


共有1个答案

郭业
2023-03-14

如果您不想在数据库中为这个“超级实体”(让我们称这个类为Being)添加一个表,您仍然可以让PersonAnimal从中继承(Person应该从AnimalBTW),并对属性上的公共字段进行映射:

public abstract class Being {
    private Integer id;
    private String name;

    // ...

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //...
}

@Entity
@Table(name = "person")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person extends Being {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty
    @Column(name = "person_id")
    public Integer getId() {
        return super.getId();
    }

    public void setId(Integer id) {
        super.setId(id);
    }

    // all below fields are generic in all the entities
    @JsonProperty
    @Column(name = "name")
    public String getName() {
        return super.getName();
    }

    public void setName(String name) {
        super.setName(name);
    }

    //...

}
 类似资料:
  • 所以我想要一个“Void Repository”,通过它可以访问不一定在实体上操作的存储过程。 但这当然不起作用,因为期望是一个实体。 有没有一种方法可以使用注释而无需创建虚拟实体,或者我是否坚持使用使用通过准备好的语句进行查询的已实现类? 因为老实说,这很难看:

  • 我想查看项目中的所有类,当我找到一个从“City”派生的类时,我想创建一个该类型的新对象并将其添加到列表中。这允许我添加功能,而无需更新列表。最重要的是,我想在不使用任何库的情况下完成它。我已经找到了类似的主题,但他们使用了org。反思。我希望避免以下情况:

  • 在jackson中,我们可以使用注释 @Json类型信息 @Json子类型 @JsonSubTypes.类型 以实现多态序列化。 我们可以选择 直接在数据模型上使用这些注释,这是最简单的方法。 在mixin上使用这些注释。这是一个关于它的链接Jackson中的多态反序列化,没有注释。 这两种解决方案都有一个问题:编写代码时必须知道所有子类。 在GraphQL中 鉴别器字段固定:"__typenam

  • 我试图了解DI在我们的代码库(Kotlin)中是如何使用的。我们正在使用googleguice进行依赖注入。 下面是一个示例类: 在模块类中: DepB类别: 据我所知,对于用< code>@Inject注释的变量,Google Guice会使用模块类来解决这些依赖关系。所以< code>DepA对象的注入方式是有意义的。 但是呢?我们如何能够在不指定任何位置的情况下注入DepB?

  • 问题内容: 我正在开发一个简单的Webapp,它将域模型公开为RESTful资源。我打算将JPA2(Hibernate)与SpringMVC REST支持一起使用。 在将Hibernate实体编组为XML / JSON时,如果该实体分离,它将为惰性子项关联抛出LazyLoadingException。如果实体仍然连接到Hibernate Session,它将几乎加载整个数据库。 我尝试使用推土机C

  • 我正在尝试编写一个相当于以下SQL查询的Hibernate Criteria API: 这是我的实体 这是我的实体 是引用的外键。虽然没有明显的实体级关系,我也不能添加任何关系。