Desta vez, vamos falar sobre o design hierárquico de Hibernate, que é o design da relação de herança entre as entidades.
Talvez isso seja mais abstrato, vejamos diretamente os exemplos.
1) Vamos primeiro olhar para a prática comum e entrar diretamente no código: as três classes reais são as seguintes:
classe pública titem implementa serializável {// omita o método get/set private int id; fabricação de cordas privadas; nome de string privado; } classe pública tbook estende o titem {// omita método get/set private int pageCount; } classe pública tdvd estende o titem {// omita o método get/set private string regionCode; }
Aqui precisamos de três arquivos de mapeamento, o conteúdo é o seguinte:
<classe name = "titem" tabela = "item"> <id name = "id" column = "id" type = "java.lang.integer"> <gerator/> </dod> <names name = "name" column = "name" type = "java.lang.string"/> <nome do nome " name = "tbook" tabela = "book"> <id name = "id" column = "id" type = "java.lang.integer"> <gerator/> </dod> <propriedades name = "name" column = "name" type = "java.lang.string"/> names names = "faburing" column = "fabricação" "tipo" column="pageCount" type="java.lang.Integer"/> </class> <class name="TDVD" table="DVD"> <id name="id" column="id" type="java.lang.Integer"> <generator /> </id> <property name="name" column="name" type="java.lang.String"/> <property name = "fabricação" column = "fabricação" tipo = "java.lang.string"/> <names name = "regioncode" column = "regioncode" type = "java.lang.string"/> </class>
Arquivos de mapeamento muito comuns, sem diferença entre os anteriores.
Vamos escrever um método de teste diretamente:
public void testSelect () {Query Query = session.CreateQuery ("From Titem"); Lista da lista = query.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {System.out.println ("Nome:"+((((titem) iter.Next ()). getName ());}}} Observe que aqui estamos usando a classe Titem, não a classe Word específica. Aqui ele procurará automaticamente subclasses herdadas da classe Titem e encontrará todos os resultados. Isso envolve um polimorfismo. A tag de classe possui o polimorfismo da propriedade e seu valor padrão está implícito, o que significa que o resultado pode ser consultado sem especificar um nome. Se for explícito, significa que você precisa especificar um nome de classe específico antes de encontrar o resultado desse tipo.
2) No exemplo anterior, usamos três arquivos de mapeamento. Quando precisamos modificar, precisamos modificar três arquivos de mapeamento, o que não é viável para grandes projetos. Além disso, cada tabela possui campos correspondentes para a classe principal correspondente, que é redundante. Então, temos o seguinte método.
A classe de entidade ainda é a mesma de 1). Mudamos o arquivo de mapeamento de três para um e apenas mantemos o arquivo de mapeamento do Titem. Mas precisamos fazer modificações correspondentes, e o conteúdo agora é o seguinte:
<classe name = "titem" tabela "=" item "polymorphism =" explictic "> <id name =" id "column =" id "type =" java.lang.integer "> <gerator/> </id> <propriedades name =" name "column =" name "type =" java.lang.string "/> <nome do nome" " type = "java.lang.string" /> <ingressou-subclass name = "tbook" tabela = "tbook"> <key colun = "id" /> <name da propriedade = "pageCount" column = "pageCount" type = "java.lang.integer" /> < /adjunto "<joned-subst. column = "id"/> <propriedade name = "regionCode" column = "regioncode" type = "java.lang.string"/> </ingressado
Aqui, temos apenas um arquivo de mapeamento, mas existe uma tag de sub-sub-subclasse, que indica que essa classe herda da classe atual, <Key> indica a chave primária da sub-tabela. Aqui, a sub-tabela refere-se às duas tabelas correspondentes às subclasses, Tbook e TDVD. Somente campos na subtable são especificados na propriedade.
Dessa forma, a tabela gerada após a execução é a seguinte:
A tabela correspondente às duas subclasses são apenas os campos que especificamos através da propriedade. Isso evita vários campos na tabela, para que a tabela de palavras mantenha apenas seus campos separados. Quando a classe do item muda, não há necessidade de fazer muitas modificações.
3) Vamos aprender sobre outro método para implementar o design hierárquico, que é alcançado colocando bandeiras na tabela. No arquivo de mapeamento de hibernato, implementamos -o através da tag descritora.
Sem mais delongas, vamos dar uma olhada no exemplo:
Modificamos o arquivo de mapeamento do Titem de ontem para:
<classe name = "titem" table = "item" polymorphism = "explictic"> <id name = "id" column = "id" type = "java.lang.integer"> <gerator/> </dod> <discriminator column = "category" type = "java.lang.string"/> <nome do nome "" name "" "" name = "fabricação" column = "fabricação" tipo = "java.lang.string"/> </class>
Vendo o meio, adicionamos uma etiqueta discriminadora, que mostra quais campo nossas duas subclasses são distinguidas.
<Subclasse name = "TBook" discriminator-value = "1"> <propriedade name = "pageCount" column = "Pagecount"/> </subclass> <Nome da subclasse = "tdvd" discriminador-value = "2"> <nome da propriedade "RegionCode" Column = "RegionCode"/> </Subclass>
Vemos esses dois parágrafos, o que indica que, quando o valor do campo especificado pelo discriminador é 1, indica que é uma classe TBook e o PageCount tem um valor; Quando o valor do campo especificado pelo discriminador é 2, indica que é uma classe TDVD e o código da região tem um valor.
Dessa forma, precisamos apenas usar uma tabela, o que indica a relação entre eles e várias classes. Observe que esse método não é bom para muitas subclasses. Isso causará muitos campos na tabela principal e causará certo inconveniente de design.