2014-01-24 4 views
0

У меня есть два объекта. Data_mart и entity_data. entity_data расширяет data_mart. У меня столбец id как в data_mart, так и в entity_data. data_id в сущности mart является начальным ключом data_mart (Pkey over is id).Проблема с выпуском HQL

@Entity 
@Table(name = "data_mart") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "type") 
public class DataMaster { 

/** The id. */ 
@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(unique = true, nullable = false) 
private Long id; 
/** The type. */ 
private String type; 

/** The created by. */ 
private String createdBy; 
..... 
} 

@Entity 
@Table(name = "entity_data") 
@PrimaryKeyJoinColumn(name = "dataId") 
@DiscriminatorValue("FILE") 
@Where(clause = "active = '1'") 
public class EntityData extends DataMaster { 

/** The data id. */ 
@Column(insertable = false, updatable = false) 
    private Long dataId; 

/** The delimiter. */ 
private String delimiter; 
.... 
} 

И структура таблицы из дочерней таблицы выглядит следующим образом

CREATE TABLE entity_data (
id bigint(20) NOT NULL AUTO_INCREMENT, 
data_id bigint(20) NOT NULL, 
delimiter varchar(20) DEFAULT NULL, 
file_path `varchar(200) DEFAULT NULL, 
... 
) 

Когда я пытаюсь обновить таблицу entity_data с запросом HQL, ниже промежуточный запрос формируется Hibernate

create temporary table if not exists HT_entity_data (id bigint not null); 
insert into HT_entity_data 
select entitydata0_.data_id as data_id from entity_data 
entitydata0_ inner join data_master entitydata0_1_ on 
entitydata0_.data_id=entitydata0_1_.id where entitydata0_.file_path='abcdd' 


update entity_data set file_path='new_path' 
where (id) IN (select data_id from HT_entity_data) 

Приведенный выше запрос дает неверные результаты. в предложении where вышеупомянутого оператора обновления, id идет. Должно быть, data_id.

Я не мог понять, как это принято ???

ответ

0

Вы должны не имеют идентификатор в подклассе. Он расширяет базовый класс, который уже имеет идентификатор. В стратегии наследования JOINED первичный ключ таблицы, связанной с подклассом, также является внешним ключом к первичному ключу таблицы, связанной с базовым классом.

См. the dcumentation.

+0

Как вы могли видеть, базовый класс не имеет столбца id. Но соответствующая таблица имеет столбец в имени id. –

Смежные вопросы