我知道,@SecondaryTable
问题已经发布了很多次,所以,如果有相同的问题(我还没有找到),请给我链接或建议。
我的数据库中有两个表(firstTable
和secondTable
),两个POJO Hibernate类(FirstTablePojo
和SecondTablePojo
)。
+----------+ +-----------+
|firstTable| |secondTable|
|----------+ |-----------+
|featureId |------------>|featureId |(secondTable's primary key)
|foo | |featureName|
|bar | +-----------+
+----------+
我想在jsp中的单个列表对象中显示这两个表中的字段,我决定使用@SecondaryTable
。这两个表由featureId
字段(它是secondTable
的主键)连接,我希望secondTable
中的featureName
与firstTable
中的字段一起显示。FirstTablePojo
前面有以下注释:
@SecondaryTable(name="secondTable",
pkJoinColumns=@PrimaryKeyJoinColumn(name="featureId",
referencedColumnName = "featureId"))
我将此属性添加到FirstTablePojo
(带有getter和setter):
@ManyToOne
@JoinColumn(name="featureId", table="secondTable")
String featureName;
在<c:forEach items="${features}" var="feature">
的帮助下,我得到了每个${feature.foo}
(foo
是我使用@SecondaryTable
之前在FirstTablePojo
中的属性)和${feature.featureName}
,我看到了每个foo
,但没有出现featureNames
。如果有人能告诉我这里遗漏了什么,以及为什么另一个表中的功能名称没有出现在FirstTablePojo
对象列表中,那就太好了。
@SecondaryTable
注释的目的是将单个实体的字段映射到多个表,就好像这些表被合并到一个表中一样。
@ManyToOne用于映射两个实体之间的多对一关联。但你只有一个。在这种情况下,这毫无意义。@JoinColumn用于指示字段映射到构成。。。join列,即指向另一个表的外键。所以这也没有道理。
只需使用以下映射:
@Column(name="featureName", table="secondTable")
String featureName;
Hibernate文档中通过一个示例对此进行了很好的解释。
如果您想将表示另一个实体的ID的外键字段放入辅助表中,那么使用@JoinColumn
是有意义的。在这种情况下,正确的方法是:
@OneToOne
@JoinColumn(name="another_entity_id", table="secondTable")
AnotherEntity anotherEntity;