java - hibernate 中的继承

标签 java hibernate inheritance orm

我想在 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]

一切都按预期进行。

引用资料

关于java - hibernate 中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3501130/

相关文章:

java - 负字符串长度

java - 如何向 MAC App Store 提交 JavaFX 应用程序?

java - 如何过滤 StAX XMLStreamReader

java - 使用 hibernate-envers 时,AUD 表中的所有 @Version 字段均为 null,但在实体中 - 表已填充好吗?

C#:没有从 Class<Child> 到 Class<Base> 的隐式转换

C++ - 派生类中的 "Member function not declared"

java - Stream 的限制不适用于基于 char 数组的 Stream

spring - Java EE 应用程序中的审核日志记录解决方案

java - 无法在 hibernate 和 spring mvc 中添加或更新外键

python - 如何在基类的函数上使用装饰器,并在继承基类时让装饰器作用于该函数