Наследование в спящем режиме - PullRequest
4 голосов
/ 17 августа 2010

Я бы хотел реализовать наследование в Hibernate.

Я создал объект ObjectClass:

@Entity
@Table(name = "object")
@Inheritance(strategy = InheritanceType.JOINED)
public class ObjectClass {
    private id;

}

и объект 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`),
 )

Таблица кодовых таблиц:

-

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? Как я могу получить объект?

EDITED : Мой файл hibernate.cfg.xml выглядит так:

<hibernate-configuration>
    <session-factory>
           <mapping class="com.mycompany.model.CodeTable" />
           <mapping class="com.mycompany.model.ObjectClass" />
        </session-factory>  
</hibernate-configuration>

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Ваши отображения и структура таблиц (приблизительно) правильны для стратегии СОЕДИНЕННОГО наследования, и я не могу воспроизвести вашу проблему.

Я использую следующие сопоставления (которые в основном те, которые вы предоставили):

@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]

Все работает как положено.

Ссылки

1 голос
/ 17 августа 2010

Как выглядит ваше отображение?

Вы читали этот раздел в документе Hibernate? Отображение наследования в Hibernate

Как вы можете прочитать по приведенной выше ссылке, ваше отображение неверно.Вы должны сообщить Hibernate, что класс code_table наследуется от класса объекта, и вы должны будете сообщить Hibernate, как эта ссылка существует в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...