2010-12-06

Użycie widoków w Hibernate

Spieszę donieść, iż błąd uniemożliwiający użycie @SecondaryTable w klasie bazowej, na który utyskiwałem w tym wpisie został w końcu poprawiony (po czterech latach od zgłoszenia!). Uaktualniłem projekt i rzeczywiście Hibernate w wersji 3.5.4 poprawnie obsługuje mapowanie bazowej encji na wiele tabel. Trafiłem jednak na kolejny problem i - w przeciwieństwie do opisywanego wcześniej - nie bardzo widzę sposób na obejście go.

Mając tabele i widok:

CREATE TABLE `TB_SOME_TABLE` (
`ID_PARENT` INT(11) NOT NULL AUTO_INCREMENT,
`READ_WRITE` TEXT,
PRIMARY KEY (`ID_PARENT`)
)

CREATE TABLE `TB_OTHER_TABLE` (
`PARENT_ID` INT(11) NOT NULL,
`SOME_DATA` TEXT
)

CREATE VIEW `VW_SOME_VIEW` AS
SELECT
`T`.`PARENT_ID` AS `PARENT_ID`,
COUNT(`T`.`PARENT_ID`) AS `READ_ONLY`
FROM
`TB_OTHER_TABLE` `T`
GROUP BY
`T`.`PARENT_ID`

i klasę:

@Entity
@Table(name = "TB_SOME_TABLE")
@SecondaryTable(
name = "VW_SOME_VIEW"
pkJoinColumns = @PrimaryKeyJoinColumn(name = "PARENT_ID")
)
public class Parent {
@Id
@Column(name = "ID_PARENT")
private Long id;

@Basic
@Column(name = "READ_WRITE, table = "TB_SOME_TABLE")
private String readWriteAtribute;

@Basic
@Column(
name = "READ_ONLY", table = "VW_SOME_VIEW",
insertable = false, updatable = false
)
private String readOnlyAttribute;

...
}

nie jesteśmy w stanie zapisać do bazy obiektu tej klasy. Pomimo, że jedyny atrybut zamapowany na widok jest tylko do odczytu (insertable i updatable równe false), to Hibernate próbuje wstawić dane do widoku, co kończy się wyjątkiem:
Unhandled exception 'JDBC exception on Hibernate data access:
SQLException for SQL [insert into VW_SOME_VIEW (PARENT_ID) values (?)];
SQL state [HY000]; error code [1471]; could not insert: [Parent]

Widać że się stara (bo w wygenerowanym SQLu nie ma kolumny READ_ONLY), ale do końca mu nie wychodzi (bo jednak próbuje wstawić do widoku wiersz nie zawierający żadnych danych). I zupełnie nie mam pomysłu co na to poradzić.
© The Useful Pot To Keep Things In
Maira Gall