gpt4 book ai didi

java - 具有继承性的 JPA 映射 View 和表

转载 作者:可可西里 更新时间:2023-11-01 08:27:50 25 4
gpt4 key购买 nike

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

选项 1 - 这个选项很好,因为我可以使用 JPA 提供的所有接口(interface)与数据库交互。这个选项不好,因为有时我必须加载一个表和一个看起来非常多余的模型,并且每个表有 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 - 这个选项很好,因为我只需要加载 View 并且每个表都有一个文件。此选项不好,因为对于 CUD 操作,我必须编写 native 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 对象,我会将您的view 实体指定为具有只读访问权限的模型对象中的一对一关系。你可以通过编写没有 setter 的 getter 来做到这一点,因为触发任何类型的集合然后保存将运行失败的查询。像这样使用继承会使您不得不在一个级别中指定所有列,并且您不知道哪些列属于哪些表或 View 。

    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 功能。这将是您的冗余。

如果您以后选择使用继承,此处不使用继承会使继承成为一个实际选项。每次都加入 View 可能对性能不利,当然这取决于您的 View 编写得有多好,但从这个意义上讲,不将它们全部放在同一个对象中可以提供更大的灵 active 。

关于java - 具有继承性的 JPA 映射 View 和表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33352788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com