休眠中的继承

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)

Pas*_*ent 2

对于 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)

一切都按预期进行。

参考