Riv*_*vki 5 java orm inheritance hibernate
我想在 Hibernate 中实现继承。
我创建了 ObjectClass 对象:
@Entity
@Table(name = "object")
@Inheritance(strategy = InheritanceType.JOINED)
public class ObjectClass {
private id;
}
Run Code Online (Sandbox Code Playgroud)
以及继承Object类的CodeTable对象:
@Entity
@ForeignKey(name = "id")
@Table(name = "code_table")
public class CodeTable extends ObjectClass{
private String description;
}
Run Code Online (Sandbox Code Playgroud)
在数据库中
对象表是:
CREATE TABLE `object` (
`id` bigint(11) NOT NULL auto_increment,
PRIMARY KEY (`id`),
)
Run Code Online (Sandbox Code Playgroud)
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,
)
Run Code Online (Sandbox Code Playgroud)
我编写了以下代码来从 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();
}
Run Code Online (Sandbox Code Playgroud)
尽管代码表中有一条记录,但我得到空列表。
当我在数据库中写入以下 SQL 时:
SELECT * FROM `code_table`
Run Code Online (Sandbox Code Playgroud)
我得到:id=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>
Run Code Online (Sandbox Code Playgroud)
对于 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; }
}
Run Code Online (Sandbox Code Playgroud)
和
@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() + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
下表:
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
Run Code Online (Sandbox Code Playgroud)
以及以下父/子记录:
insert into object values (1);
insert into code_table(id, description) values (1, 'foo');
Run Code Online (Sandbox Code Playgroud)
并运行您的条件查询:
session.createCriteria(CodeTable.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list();
Run Code Online (Sandbox Code Playgroud)
返回:
CodeTable [getDescription()=foo, getId()=1]
Run Code Online (Sandbox Code Playgroud)
一切都按预期进行。
| 归档时间: |
|
| 查看次数: |
2034 次 |
| 最近记录: |