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

使用继承映射视图和表的JPA

刁冠宇
2023-03-14

选项1-这个选项很好,因为我可以使用JPA提供的所有接口与DB交互。这个选项是不好的,因为有时我必须加载一个表和一个模型,这似乎是非常多余的,我有3个文件每个表。

    Model.java
    package models;
    // relevant imports
    public abstract class Model {
       // columns that are shared with table and view
    }

    Table.java
    package models;
    // relevant imports
    @entity("table")
    public class Table extends Model {
       // Relationships with other tables 
    }

    View.java
    package models;
    // relevant imports
    @entity("view")
    public class View extends Model {
       // View specific columns ...
       // Relationships with other views
    }

选项2-这个选项很好,因为我只需要加载视图,而且每个表有一个文件。这个选项是不好的,因为对于CUD操作,我必须编写本机SQL。

    Model.java
    package models;
    // relevant imports
    @entity("view")
    public class Model {
       // All VIEW + table columns
       // All relationships with other models
       // custom SQL to insert update or delete
    }

共有1个答案

陶唯
2023-03-14

如果所有表都有一个相应的view对象,那么我会将view实体指定为具有只读访问权限的模型对象内部的一对一关系。您只需编写不带setter的getter就可以做到这一点,因为启动任何类型的set然后保存都会运行一个失败的查询。像这样使用继承将使您陷入必须在一个级别中指定所有列的境地,并且您将不知道哪些列属于哪些表或视图。

    Table.java
    package models;
    // relevant imports
    @entity("table")
    public class Table{
        @OneToOne(mappedBy = "table")
        private View view;
        public string getVariable();
        public string setVaraible();
    }

    View.java
    package models;
    // relevant imports
    @entity("view")
    public class View{
       @OneToOne
       @JoinColumn(name = "table_id")
       private Table table;

       public string getVariable();
       public string getVariable2();
       public string getVariable3();//etc, No setters.

       //alternatively use insertable//updateable=false on all column annotation
       @Column(name="variable_4", insertable =  false, updateable=false)
       public string getVariable4();
    }

将它们集中在模型对象中有点儿破坏了将ORM放在那里的目标,因为现在您将不得不编写大量的mysql代码来匹配ORM的基本CRUD功能。这对你来说是多余的。

如果您以后选择使用继承,在这里不使用继承就会将继承作为一个实际的选项打开。每次加入视图可能会对性能不利,这取决于视图编写的好坏,当然,但不将它们全部放在同一个对象中可以在这个意义上提供更多的灵活性。

 类似资料:
  • 1. 前言 本节课程和大家一起学习继承映射。通过本节课程的学习,你将了解到: 什么是继承映射; 实现继承映射的 3 种方案。 2. 继承映射 学习继承映射之前,需要搞清楚什么是继承映射? 继承是 OOP 中的概念,其目的除了复用代码之外,还用来描述对象在现实世界中的关系。 为了更好地讲解继承映射,咱们再在数据库中创建一张老师表。数据库中多了一张表,按照使用 Hibernate 的套路,理所当然应该

  • 我在JPA实体映射方面有问题。我有一些课: A级 类别b Classc *如何解决这个问题?*我还能使用类继承吗?还是另一个解决这个的方法? 谢了。

  • exVim 将会允许用户生成指定类的类继承图。这是由 ex-hierarchy 插件完成的. 当运行:Update命令后,exVim将会生成继承文件。这个文件将会从你的ctags生成信息里面提取继承信息。它记录 你工程中类的继承关系。 ex-hierarchy 插件在你输入一个类时将会解析这个继承文件,它将会生成一个 Graphviz点格式文件,然后使用Graphviz画一个.png格式的图片。

  • 这类似于JPA映射带有继承的视图和表,但由于接受的答案不能让我满意,所以我决定问自己的问题。 我有一个基于类,它包含所有实体的公共字段 我想像现在一样读/写,但我不知道如何映射,以便JPA查询可以使用它。我用做了一些努力,但没有成功。如果我将中的所有字段复制到中,那么我的应用程序将按预期运行,但这并不适合我。如何映射视图以便使用继承?

  • 我的域名: 我的DTO: 我的地图绘制程序如下所示: 但是,我得到了以下错误: 目标名称“Framework.system”的类型Framework中的未知属性“system”。你是说“框架外部化”吗?目标名称为“Framework.availability”的Framework类型中的未知属性“availability”。你是说“框架外部化”吗?

  • 问题内容: 我的数据模型代表法人实体,例如企业或个人。两者都是纳税实体,都具有TaxID,电话号码和邮件地址的集合。 我有一个Java模型,其中有两个扩展抽象类的具体类。抽象类具有两个具体类共有的属性和集合。 我正在 MySQL* 数据库上使用 Hibernate JPA注释,其类如下: * 问题是,和对象需要参考他们的主人,这是一个。hibernate抱怨: 看来这将是一个相当普遍的Java继承