这类似于JPA映射带有继承的视图和表,但由于接受的答案不能让我满意,所以我决定问自己的问题。
我有一个基于类,它包含所有实体的公共字段
@MappedSuperclass
@Access(AccessType.FIELD)
public abstract class CommonFields{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
(...)
}
@Entity
@Table(name = "my_table")
public class Table extends CommonFields{
(..)
}
@Immutable
@Entity
@Table(name = "my_table_plus_view")
public class TableView extends Table{
(..)
}
我想像现在一样读/写table
,但我不知道如何映射tableview
,以便JPA查询可以使用它。我用inheritanceType
做了一些努力,但没有成功。如果我将table
中的所有字段复制到tableview
中,那么我的应用程序将按预期运行,但这并不适合我。如何映射视图以便使用继承?
您可以将一个实体映射到两个表(在您的例子中是一个表和一个视图)。您可以使用@secondarytable
。然后,视图的列成为实体表的属性,可以像查询其他列一样进行查询。
为了确保不变性,您可以标记列,您可以使用@column
的insertable
和updatable
属性。
@Entity
@Table(name = "my_table")
@SecondaryTable(name = "my_table_plus_view")
public class Table extends CommonFields{
@Column(name="col_from_view", table="my_table_plus_view",
insertable=false, updatable = false)
private String someField;
}
https://en.wikibooks.org/wiki/java_persistence/tables#multiple_tables
另一种方法是创建一个指向视图的新实体,并使用@OneToOne
从表中映射它。只要此关系始终存在(即标记为optional=false
),则此方法的优点是仅按需加载视图数据,而使用@secondarytable
选项,每次加载时都将执行联接。您的模型的客户端仍然只能处理一个实体,因为您不需要向外部世界公开第二个实体:
@Entity
@Table(name = "my_table")
public class Table extends CommonFields{
//can be lazily loaded only when optional = false
//see: http://stackoverflow.com/questions/17987638/hibernate-one-to-one-lazy-loading-optional-false
@OneToOne(optional = false)
@JoinColumn(name = "x")
private TableView tableView;
public int getCalculatedValue(){
return tableView.getCalculatedValue();
}
}
@Entity
@Table(name = "my_table_plus_view")
public class TableView{
private int calculatedValue;
}
在另一个场景中,您可以使用继承,就像上面所尝试的那样。然后,应用程序将公开两个实体Table和TableView。当您有两个单独的表时,您需要指出您希望使用一个联合的继承策略。这是您的代码中缺少的部分:
https://en.wikibooks.org/wiki/java_persistence/inherite#joined.2c_multiple_table_inheritage
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name = "my_table")
public class Table extends CommonFields{
}
@Entity
@Table(name = "my_table_plus_view")
public class TableView extends Table{
}
使用JOIND策略,Hibernate不需要鉴别器列。
Hi这似乎适用于添加额外的方法,但不适用于在现有方法上添加新的注释。假设我们有以下课程:
选项1-这个选项很好,因为我可以使用JPA提供的所有接口与DB交互。这个选项是不好的,因为有时我必须加载一个表和一个模型,这似乎是非常多余的,我有3个文件每个表。 选项2-这个选项很好,因为我只需要加载视图,而且每个表有一个文件。这个选项是不好的,因为对于CUD操作,我必须编写本机SQL。
因此,当我将对象转换为JSON字符串时: dob以以下方式写入JSON字符串: “dob”:{“年份”:1964,“月份”:“二月”,“纪年”:{“日历类型”:“ISO8601”,“ID”:“ISO”},“月份值”:2,“DayofMonth”:13,“DayofWeek”:“星期四”,“Era”:“CE”,“DayofYear”:44,“LeapYear”:true 所以,我不知道我是如何做到这
主要内容:列表映射实例,程序输出结果,以下是纠正/补充内容:列表(List)是一个用于基于索引插入和删除元素的接口。当需要以用户定义的顺序检索元素时,可以使用它。 列表映射实例 在这个例子中,我们将一个对象嵌入到一个实体类中,并将其定义为一个集合类型 - 。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,这个类包含员工, 和嵌入对象(员工地址)。注解 表示嵌入对象。 文件:Employee.java 的代码如下所示 - 第2步: 在包下创建一个
我有一个特点和扩展它的对象。 我想创建这个对象的列表并映射到上面: 以及实现Poly函数的不同尝试: 编译器告诉我: 错误:(45,43)找不到参数映射器的隐式值:无形状。ops。hlist。映射器[com.test.EncodePoly.type,com.test.A.type::com.test.B.type::com.test.C.type::shapeless.HNil]val结果:Lis
我已经实现了Spring数据存储库,它使用注释扩展MongoRepository,将它们标记为RESTendpoint。但当映射请求id时,会得到以下异常 存储库: GET 请求我正在尝试: 回应: 另外,我为每个存储库配置了两个数据库。 Application.yml文件: 主要类 : 这里会出什么问题?