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

在Hibernate中扩展/修改生成的实体

柯翔
2023-03-14

我正在为mysql数据库创建一个REST api服务。我使用IntelliJ的持久化工具生成了类。它做得很好。

我正在使用的模式有一些古怪之处。用户希望endpoint可由“id”主键列以外的其他属性访问。

Ex:<代码>/对象/

这里有一个问题。模式可以改变。name属性不会去任何地方,所以我可以安全地假设它将永远在对象上。

我了解到您可以使用超类强制这些生成的实体具有自定义属性而不会影响数据库模式。我不想在生成的实体中进行模型更改并更新数据库表布局,因为它不是我的数据库。

我有一门课叫动物。

    @Entity
    @Table(name = "animals", schema = "xyz123", catalog = "")
    public class AnimalEntity extends AnimalSuperclass {
        private Integer id;
        private String name;
        private String description;

        @Id
        @Column(name = "id", nullable = false)
        public Integer getId() {
            return id;
        }

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

        @Basic
        @Column(name = "name", nullable = true, length = 80)
        public String getName() {
            return name;
        }

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

        @Basic
        @Column(name = "description", nullable = true, length = 255)
        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            RoleEntity that = (RoleEntity) o;
            return Objects.equals(id, that.id) &&
                    Objects.equals(name, that.name) &&
                    Objects.equals(description, that.description);
        }

        @Override
        public int hashCode() {

            return Objects.hash(id, name, description);
        }
    }

我必须手动添加扩展AnimalSuperclass。现在很好。最终我将尝试在运行时使用. xmls生成这些。

然后我有这个超类...

    @MappedSuperclass
    public class AnimalSuperclass implements Serializable  {
        private String testMessage;
        private String name;
        private Integer id;

        @Transient
        public String getTestMessage() {
            return this.testMessage;
        }

        public void setTestMessage(String id) {
            this.testMessage = testMessage;
        }
    }

我想做的是强制@Id注释在超类内的name属性上。类似这样的东西...@Mpse dSuperclass公共类AnimalSuperclass实现Serializable{Private String testMessage;私有字符串名称;私有整数id;

        @Transient
        public String getTestMessage() {
            return this.testMessage;
        }

        public void setTestMessage(String id) {
            this.testMessage = testMessage;
        }

        @Basic
        @Id
        @Column(name = "name", nullable = false, length = 15)
        private String getName() {
            return name;
        }

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


        @NaturalId
        @Column(name = "id", nullable = false)
        private Integer getId() {
            return id;
        }

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

我该怎么做?目前,当我到达endpoint时,这会抛出一个错误:{"原因": null,"消息":"Id必须可分配给Serializable!: null"}

Java不是我的第一语言,所以我无论如何都不是专家。但从我读到的内容来看,不可能从超类重写子类属性。有没有更好的方法来实现这一点,可以使用RepositoryRestConfiguration?我正在使用分页和排序存储库为这些实体提供服务。我无法扩展实体并将我的超类用作子类,因为这会在模式中创建dType属性,并且我无法更改表布局。

共有1个答案

翟英达
2023-03-14

请求和您的实体之间没有硬链接。在您的存储库中,您可以编写可以查询从请求中带来的数据的方法。

例如,如果他们正在请求一个名字,您可以执行以下操作

Page<AnimalEntity> findByName(String name, Pageable pageable);

在您的存储库中。Spring将处理其余部分,然后您可以在控制器中调用它。

@Service
public class AnimalService {
  @Autowired
  private AnimalEntityRepository animalRepo;


  public Page<AnimalEntity> findAnimal(String name) {

    Page<AnimalEntity> animals = animalRepo.findByName(name, new PageRequest(1,20));

    return animals;
  }
}

需要指出的一点是,根据您在将实体发送回客户机时配置Hibernate的方式,以及实体被序列化的情况,可能会出现初始化失败的错误。如果是这种情况,您的实体将必须转换为POJO(普通旧java对象)并返回。

 类似资料:
  • 我是Hibernate新手,所以我对此一无所知。Hibernate会生成SQL查询并在数据库上触发。 我能够从控制台检索查询,但我也希望在触发查询之前对其进行修改。 因此,如果查询为:

  • 是否有可能在这个答案中提供等效的内容,但在TypeScript中? 对 Java 生成器类进行子类化 这是迄今为止我对基类的了解: 和扩展类: 正如另一个线程提到的,由于上下文的变化,我将无法按此顺序构建客户: 我目前正在尝试使用泛型来解决此问题,但是在为我的 setter 方法返回 this 指针时遇到问题(类型 this 不能分配给类型 T)。有什么想法吗?

  • 本文向大家介绍修改或扩展jQuery原生方法的代码实例,包括了修改或扩展jQuery原生方法的代码实例的使用技巧和注意事项,需要的朋友参考一下 修改或者扩展jQuery的方法代码实例: 毫无疑问,jQuery是一款功能强大且使用方便的类库。 从它的广泛应用可以证实上面的观点,但是正所谓人无完人,金无足赤,jQuery也是如此,并非在任何时候或者场合都能够完美的完成我们的任务,所以有事以后就需要对j

  • 问题内容: 我有2个Maven项目在他们各自的POM中共享一个JPA项目作为依赖项。JPA项目在2.1版上,并且成功实现了hibernateenvers。但是,我现在需要创建一个自定义的RevisionEntity,因为我需要审核其他属性,例如登录的用户ID。问题是: 一世。我不能在JPA项目中直接实现 ii。父maven项目的检索登录用户的实现不同。 真正的挑战实际上是实现RevisionLis

  • 目录 1. ext_skel 2. PECL_Gen 3. 小结 毫无疑问你已经注意到,每个php扩展都包含一些非常公共的并且非常单调的结构和文件。当开始一个新扩展开发的时候,如果这些公共的结构已经存在, 我们只用考虑填充功 能代码是很有意义的. 为此, 在php中包含了一个简单但是很有用的shell脚本。

  • 问题内容: 我有一个包含两个字段的表,我想要两个对象。 第一个只有field1 第二个有两个领域 我使用加载每个 我想做的就是扩展。我将如何去做? 问题答案: 如果要在所需表中保存公共字段,则意味着假设您拥有A类和B类,并且具有一些通用文件(例如created_by,updated_by),并且希望将field1,field2保存在两个实体中:IN数据库级: 对于这种类型的结构,您应该使用@Map