Riv*_*vki 5 java orm inheritance hibernate
我想在 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`
我得到: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>
对于 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]
一切都按预期进行。
| 归档时间: | 
 | 
| 查看次数: | 2034 次 | 
| 最近记录: |