我想在 Hibernate 中实现继承。
我创建了 ObjectClass 对象:
@Entity
@Table(name = "object")
@Inheritance(strategy = InheritanceType.JOINED)
public class ObjectClass {
private id;
}
和继承Object类的CodeTable对象:
@Entity
@ForeignKey(name = "id")
@Table(name = "code_table")
public class CodeTable extends ObjectClass{
private String description;
}
在数据库中
对象表是:
CREATE TABLE `object` (
`id` bigint(11) NOT NULL auto_increment,
PRIMARY KEY (`id`),
)
code_table 表是:
-
CREATE TABLE `code_table` (
`id` bigint(11) NOT NULL auto_increment,
`description` varchar(45) character set latin1 default NULL,
PRIMARY KEY (`id`),
KEY `FK_object` (`id`),
CONSTRAINT `FK_object` FOREIGN KEY (`id`) REFERENCES `object` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
)
我编写了以下代码来从 codeTable 中检索数据:
@SuppressWarnings( "unchecked" )
@Transactional( readOnly = true, propagation = Propagation.REQUIRED )
public Collection<CodeTable> findAll() {
Session session = getSessionFactory().getCurrentSession();
return
session.createCriteria( persistentClass
).setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY
).list();
}
虽然代码表中只有一条记录,但我得到的是空列表。
当我在数据库中编写以下 SQL 时:
SELECT * FROM `code_table`
我得到: 身份证= 1, 描述 = 公司。
我的 Hibernate 定义出了什么问题?如何检索对象?
已编辑: 我的 hibernate.cfg.xml 文件如下所示:
<hibernate-configuration>
<session-factory>
<mapping class="com.mycompany.model.CodeTable" />
<mapping class="com.mycompany.model.ObjectClass" />
</session-factory>
</hibernate-configuration>
最佳答案
对于 JOINED 继承策略,您的映射和表结构(大致)是正确的,我无法重现您的问题。
我使用以下映射(基本上是您提供的映射):
@Entity
@Table(name = "object")
@Inheritance(strategy = InheritanceType.JOINED)
public class ObjectClass {
@Id @GeneratedValue
private Long id;
public ObjectClass() { }
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
}
和
@Entity
@ForeignKey(name = "id")
@Table(name = "code_table")
public class CodeTable extends ObjectClass{
private String description;
public CodeTable() { }
public String getDescription() { return description; }
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "CodeTable [getDescription()=" + getDescription() + ", getId()="
+ getId() + "]";
}
}
下表:
create table code_table (
description varchar(255),
id bigint not null,
primary key (id)
)
create table object (
id bigint not null,
primary key (id)
)
alter table code_table
add constraint id
foreign key (id)
references object
以及以下父/子记录:
insert into object values (1);
insert into code_table(id, description) values (1, 'foo');
并运行您的标准查询:
session.createCriteria(CodeTable.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list();
返回:
CodeTable [getDescription()=foo, getId()=1]
一切都按预期进行。
引用资料
- JPA 1.0 规范
- 2.1.10 继承映射策略
- Hibernate 注释引用指南
关于java - hibernate 中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3501130/