具有继承性的 JPA 映射视图和表

2024-06-28

我有一个无法更改的数据库设计。数据库具有具有一对一关系的表和视图。这些视图包含一些从表中计算出的额外信息。相关信息是行的状态。为此关系设置的权限是视图是只读的,因为表具有所有可用的 CRUD 操作。 JPA 是选择映射到此设置的 ORM。该应用程序是一个基本的 CRUD 应用程序,通过检查视图中的状态和其他属性然后插入/更新相应的表来进行一些验证。这是我尝试对此案例进行建模的两种方法的示例。我想知道哪一个更有效,更容易使用,和/或“正确的方法”来做到这一点。

选项 1 - 这个选项很好,因为我可以使用所有 JPA 提供的接口与数据库交互。这个选项很糟糕,因为我有时必须加载一个表和一个模型,这看起来非常多余,而且每个表有 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
    }

我会指定你的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 功能。这对你来说将是多余的。

如果您稍后选择使用继承,则此处不使用继承会使继承成为一个实际选项。每次加入视图可能会降低性能,当然这取决于视图的编写程度,但从这个意义上说,不将它们全部放在同一个对象中可以提供更大的灵活性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有继承性的 JPA 映射视图和表 的相关文章

随机推荐