Mapeamento de mapas
O mapa do mapa é uma coleção Java que armazena elementos em pares de valor-chave e não permite elementos duplicados em uma lista. A interface do MAP fornece três visualizações de coleção, permitindo que o conteúdo do mapa seja considerado um conjunto de coleções de valor-chave ou definindo o relacionamento de mapeamento do valor-chave.
O mapa é mapeado para um elemento <Pap> na tabela de mapeamento e um mapa não ordenado pode ser inicializado em java.util.hashmap.
Defina a tabela RDBMS:
Considere uma situação em que precisamos que os registros dos funcionários sejam armazenados na tabela de funcionários, que terá a seguinte estrutura:
Criar funcionário da tabela (ID int não nulo auto_increntle, primeiro_name varchar (20) nulo padrão, last_name varchar (20) nulo padrão, nulo padrão nulo padrão, chave primária (id));
Além disso, supõe -se que cada funcionário possa ter um ou mais certificados relacionados a ele. Armazenamos as informações relevantes do certificado em uma tabela separada com a seguinte estrutura:
Criar certificado de tabela (ID int não nulo auto_increntle, certificado_type varchar (40) nulo padrão, certificado_name varchar (30) null padrão, funcionário_id int padrão nulo, chave primária (id));
Há uma relação de um para muitos entre o funcionário e o objeto de certificado.
Definir aula de Pojo:
Vamos implementar um funcionário da classe Pojo que será usado para manter uma coleção de objetos na tabela de funcionários e uma variável de lista com certificados.
importar java.util.*; Public Class Funcionário {private int id; String privada primeiro nome; string privada stringname; salário privado int; Certificados de mapa privado; public funcionário () {} funcionário público (string fname, string lname, int salário) {this.firstname = fname; this.LastName = lname; this.salary = salário; } public int getId () {return id; } public void setId (int id) {this.id = id; } public String getFirstName () {return FirstName; } public void setFirstName (String First_Name) {this.firstName = First_Name; } public string getLastName () {return lastName; } public void setLastName (string last_name) {this.lastName = last_name; } public int getSalary () {retornar salário; } public void SetSalary (salário int) {this.salary = salário; } mapa público getCertificates () {return Certificates; } public void setCertificates (certificados de mapa) {this.certificates = certificados; }}Precisamos da tabela de certificação correspondente para definir outra classe Pojo, esse objeto de certificado pode armazenar e recuperar a tabela de certificados.
Certificado de classe pública {private int id; nome de string privado; public certificado () {} public certificado (nome da string) {this.name = name; } public int getId () {return id; } public void setId (int id) {this.id = id; } public string getName () {return name; } public void setName (nome da string) {this.name = name; }} Defina o arquivo de mapeamento de hibernato:
Vamos desenvolver um arquivo de mapeamento que instrua o Hibernate como definir uma classe mapeada para uma tabela de banco de dados. O elemento <Pap> será usado para definir as regras para o mapa usado.
<? xml versão = "1.0" coding = "utf-8"?> <! <meta attribute = "classe-descrição"> Esta classe contém os detalhes do funcionário. </meta> <id name = "id" type = "int" column = "id"> <gerator/> </id> <mapa name = "certificados" cascade = "all"> <key column = "funcionário_id"/> <index column = "certificado_type" type = "string"/> <one-toman/> </map> </map> </"" <propriedade name = "lastName" colun = "last_name" type = "string"/> <propriedade name = "salário" column = "salary" type = "int"/> </class> <classe name = "certificado" tabela = "certificado"> <meta attribute = "classe-descrição"> Esta classe contém o certificado. </meta> <id name = "id" type = "int" column = "id"> <gerator/> </id> <propriedade name = "name" column = "certificado_name" type = "string"/> </class> </hibernate-mapping>
O formato <SCLASSNAME> .hbm.xml no arquivo de mapeamento que deve ser salvo. Salvamos o arquivo do arquivo.hbm.xml no arquivo de mapeamento. Já familiarizado com a maioria dos detalhes do mapeamento, mas vamos analisar todos os elementos no arquivo de mapeamento novamente:
Um documento mapeado é um documento XML com <hibernate-mapping> como um elemento raiz correspondente a cada classe que contém 2 elementos <Class>.
O elemento <Stem> é usado para definir um mapeamento específico da tabela de banco de dados de uma classe Java. O nome da classe java especifica o atributo de nome do elemento de classe e o nome da tabela do banco de dados do atributo de tabela Especifica.
O elemento <mEta> é um elemento opcional que pode ser usado para criar uma descrição da classe.
O elemento <ID> mapeia o atributo de ID exclusivo na classe para a chave primária da tabela de banco de dados. O atributo de nome do elemento ID refere -se à classe do atributo e o atributo da coluna refere -se às colunas na tabela de banco de dados. O atributo de tipo salva o tipo de mapeamento de hibernato, que será convertido do tipo de dados Java para SQL.
O elemento <gerator> dentro do elemento ID é usado para gerar automaticamente o valor da chave primária. Defina o atributo de classe do elemento gerado como nativo para permitir que o hibernato pegue o algoritmo em identidade, sequência ou hilo para criar chaves primárias de acordo com os recursos de suporte do banco de dados subjacente.
O elemento <erpoy> é usado para mapear as propriedades de uma classe Java para colunas em uma tabela de banco de dados. O atributo de nome de um elemento refere -se à classe do atributo e ao atributo da coluna refere -se às colunas na tabela de banco de dados. O atributo de tipo salva o tipo de mapeamento de hibernato, que será convertido do tipo de dados Java para SQL.
O elemento <Pap> é usado para definir o relacionamento entre o certificado e a classe de funcionários. Utilizamos o elemento <Pap> do atributo Cascade para informar ao Hibernate para salvar o objeto de certificado e também para o objeto do funcionário. O atributo de nome está definido para definir o MapVariable na classe pai, no nosso caso o certificado.
O elemento <index> é usado para representar pares de chaves/valores de chaves e valores. Esta chave usará um tipo de string armazenado no certificado da coluna.
O elemento <Key> é o objeto pai que contém uma chave estrangeira, ou seja, a coluna na tabela de certificados. Funcionário da mesa.
O elemento <ene-to-Many> indica que um objeto de funcionário envolve muitos objetos de certificado e, portanto, o objeto de certificado deve estar relacionado à classe pai do funcionário. Você pode usar os elementos <One-one>, <fast-to-one> ou <fast-to-Many>, conforme necessário.
Crie uma classe de aplicativo:
Por fim, crie o método principal () da classe de aplicativo para executar o aplicativo. Use este aplicativo para salvar registros dos funcionários junto com a lista de certificados e, em seguida, execute registros na operação CRUD no aplicativo.
importar java.util.*; importar org.hibernate.hibernateException; importar org.hibernate.session; importar org.hibernate.transaction; importar org.hibernate.sessionFactory; importar org.hibernate.cfg.configuration; public class ManageEmployee {private Static SesstionFactory Factory; public static void main (string [] args) {try {factory = new Configuration (). Configure (). buildSessionFactory (); } Catch (ex -throwable ex) {System.err.println ("Falha ao criar o objeto SessionFactory." + Ex); lançar uma nova excepçãoininitializerError (ex); } Gerencia o empregado eu = new ManageEmployee (); / * Vamos ter um conjunto de certificados para o primeiro funcionário */ hashmap set = new hashmap (); set.put ("Computerscience", novo certificado ("MCA")); set.put ("Businessmanagement", novo certificado ("MBA")); set.put ("ProjectManagement", novo certificado ("pmp")); / * Adicionar registros de funcionários no banco de dados */ inteiro empid = me.addemployee ("manoj", "kumar", 4000, conjunto); / * Liste todos os funcionários */ me.listemployee (); / * Atualize os registros salariais do funcionário */ me.UpdateEmployee (empid, 5000); / * Liste todos os funcionários */ me.listemployees (); } / * Método para adicionar um registro de funcionários no banco de dados * / public integer addEmployee (string fname, string lname, int salário, hashmap cert) {session = factory.openssion (); Transação tx = nulo; Inteiro funcionárioID = nulo; tente {tx = session.begIntransaction (); Funcionário do funcionário = novo funcionário (fname, lname, salário); Employee.SetCertificates (CERT); empregado = (inteiro) session.save (funcionário); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); E.PrintStackTrace (); } finalmente {session.close (); } retornar o funcionárioID; } / * Método para listar todos os detalhes dos funcionários * / public void listemployees () {Session Session = factory.opensssion (); Transação tx = nulo; tente {tx = session.begIntransaction (); Listar funcionários = session.createquery ("do funcionário"). List (); for (iterator iterator1 = funcionário.iterator (); iterator1.hasnext ();) {funcionário = (funcionário) iterator1.next (); System.out.print ("primeiro nome:" + funcionário.getfirstname ()); System.out.print ("Sobrenome:" + Employee.getLastName ()); System.out.println ("Salário:" + Employee.getSalary ()); Mapa ec = funcionário.getCertificates (); System.out.println ("certificado:" + (((((certificado) ec.get ("computerscience")). GetName ())); system.out.println ("certificado:" + ((((certificado) ec.get ("administração de negócios"). (((Certificado) Ec.get ("ProjectManagement")). GetName ())); E.PrintStackTrace (); funcionário.SetSalary (Salário); Sessão = Factory.OpenSession (); Finalmente {session.close (); Compilar e executar:
Aqui estão as etapas para compilar e executar o aplicativo acima. Certifique -se de definir o caminho e o caminho de classe adequadamente antes de compilar e executar.
Os seguintes resultados serão obtidos na tela e os registros são criados nos formulários de funcionários e certificados.
$ java ManageEmployee
..... várias mensagens de log serão exibidas aqui .........
Primeiro Nome: Manoj Sobrenome: Kumar Salário: 4000Certificate: McAcertificate: Mbacertificate: PMPFirst Nome: Manoj Sobrenome: Kumar Salário: 5000Certificate: McAcertificate: Mbacertificate: PMP
Se você verificar o funcionário e o formulário de certificado, registre -o:
mysql> selecione * do funcionário;
+-------------------------------+------------+| id | primeiro_name | Último nome | Salário |+------------------------------------+---------------+| 60 | Manoj | Kumar | 5000 |+-------------------------------+---------+1 linha no conjunto (0,00 s)
mysql> selecione * do certificado;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Mapeamento de mapa classificado
O STORDMAP é um elemento armazenado em um par de valores-chave e fornece o tipo geral de chaves semelhantes às coleções Java para mapeamentos. Elementos duplicados não são permitidos no mapeamento. O mapa é classificado na ordem natural de suas chaves, ou fornecendo uma comparação geralmente no tempo de criação do mapa ordenado.
Os elementos <Pap> e mapas ordenados que classificam o mapeado são mapeados na tabela de mapeamento podem ser inicializados em java.util.treemap.
Ainda usamos a tabela RDBMS e a classe POJO definidas acima para ilustrar o seguinte exemplo:
Defina o arquivo de mapeamento de hibernato:
Vamos desenvolver um arquivo de mapeamento que instrua o Hibernate como definir uma classe mapeada para uma tabela de banco de dados. O elemento <Pap> será usado para definir as regras para o mapa usado.
<? xml versão = "1.0" coding = "utf-8"?> <! <meta attribute = "classe-descrição"> Esta classe contém os detalhes do funcionário. </meta> <id name = "id" type = "int" column = "id"> <gerator/> </id> <mapa name = "certificados" cascade = "all" sort = "myclass"> <key column = "funcionário_id"/> <index column = "certificado_type" = "string"/> <ned " type = "string"/> <propriedade name = "lastName" colun = "last_name" type = "string"/> <names name = "salário" column = "salary" type = "int"/> </class> <classe name = "certificado" tabela "tabela" "> <meta attribute =" classe-de-descrição "> este contém o certificado do certificado. </meta> <id name = "id" type = "int" column = "id"> <gerator/> </id> <propriedade name = "name" column = "certificado_name" type = "string"/> </class> </hibernate-mapping>
O formato <SCLASSNAME> .hbm.xml no arquivo de mapeamento que deve ser salvo. Salvamos o arquivo de mapeamento do arquivo funcionário.hbm.xml. Já familiarizado com a maioria dos detalhes do mapeamento, mas vamos analisar todos os elementos no arquivo de mapeamento novamente:
Um documento mapeado é um documento XML com um elemento raiz de <hibernate-mapping> correspondente a cada classe que contém 2 elementos <Class>.
O elemento <Stem> é usado para definir um mapeamento específico da tabela de banco de dados de uma classe Java. O nome da classe java especifica o atributo de nome do elemento de classe e o nome da tabela do banco de dados do atributo de tabela Especifica.
O elemento <mEta> é um elemento opcional que pode ser usado para criar uma descrição da classe.
O elemento <ID> mapeia o atributo de ID exclusivo na classe para a chave primária da tabela de banco de dados. O atributo de nome do elemento ID refere -se à classe do atributo e o atributo da coluna refere -se às colunas na tabela de banco de dados. O atributo de tipo salva o tipo de mapeamento de hibernato, que será convertido do tipo de dados Java para SQL.
O elemento <gerator> dentro do elemento ID é usado para gerar automaticamente o valor da chave primária. Defina o atributo de classe do elemento gerado para tornar o hibernato correspondente ao algoritmo em identidade, sequência ou hilo para criar chaves primárias de acordo com os recursos de suporte do banco de dados subjacente.
O elemento <erpoy> é usado para mapear as propriedades de uma classe Java para colunas em uma tabela de banco de dados. O atributo de nome de um elemento refere -se à classe do atributo e ao atributo da coluna refere -se às colunas na tabela de banco de dados. O atributo de tipo salva o tipo de mapeamento de hibernato, que será convertido do tipo de dados Java para SQL.
O elemento <Pap> é usado para definir o relacionamento entre o certificado e a classe de funcionários. Utilizamos o elemento <Pap> do atributo Cascade para informar ao Hibernate para salvar o objeto de certificado e também para o objeto do funcionário. O atributo de nome é definido para a variável SortedMap definida na classe pai, no nosso caso, é um certificado. A propriedade de classificação pode ser definida como classificação natural, ou pode ser definida como implementação de classe personalizada como java.util.comparator. Usamos uma classe de classe que a implementa como java.util.comparator para reverter a ordem de classificação da implementação da classe de certificado.
O elemento <índice> é usado para representar a parte chave do mapa do par de chaves/valores. Esta chave usará um tipo de string armazenado no certificado da coluna.
O elemento <Key> é o objeto pai que contém uma chave estrangeira, ou seja, a coluna na tabela de certificados. Funcionário da mesa.
O elemento <ene-to-Many> indica que um objeto de funcionário envolve muitos objetos de certificado e, portanto, o objeto de certificado deve estar associado ao pai do funcionário. Você pode usar os elementos <One-one>, <fast-to-one> ou <fast-to-Many>, conforme necessário.
Se você usar o sort = "natural", não precisamos criar uma classe separada, porque a classe de certificado implementou a interface comparável e o hibernato usará o compareto na classe de certificado definida como o método classedMap (). No entanto, estamos usando uma classe de comparador personalizada MyClass em nosso arquivo de mapeamento, por isso temos que criar essa classe com base em nosso algoritmo de classificação. Vamos fazer a classificação de chave disponível no mapa.
importar java.util.comparator; classe pública myclass implementa o comparador <tring> {public int compare (string o1, string o2) {final int antes = -1; final int após = 1; / * Para reverter a ordem de classificação, múltiplo por -1 */ if (o2 == null) {retorna antes * -1; } Comparável thisCertificate = O1; Comparável thatCertificate = O2; if (thisCertificate == null) {retorna após * 1; } else if (thatCertificate == null) {retorna antes * -1; } else {return thisCertificate.compareto (thatCertificate) * -1; }}}Por fim, criaremos o método principal () da classe de aplicativo para executar o aplicativo. Usaremos este aplicativo para salvar alguns registros de funcionários junto com o certificado e, em seguida, enviaremos a operação CRUD acima dos registros.
importar java.util.*; importar org.hibernate.hibernateException; importar org.hibernate.session; importar org.hibernate.transaction; importar org.hibernate.sessionFactory; importar org.hibernate.cfg.configuration; public class ManageEmployee {private Static SesstionFactory Factory; public static void main (string [] args) {try {factory = new Configuration (). Configure (). buildSessionFactory (); } Catch (ex -throwable ex) {System.err.println ("Falha ao criar o objeto SessionFactory." + Ex); lançar uma nova excepçãoininitializerError (ex); } Gerencia o empregado eu = new ManageEmployee (); / * Vamos ter um conjunto de certificados para o primeiro funcionário */ Treemap set1 = new Treemap (); set1.put ("Computerscience", novo certificado ("MCA")); set1.put ("Businessmanagement", novo certificado ("MBA")); set1.put ("ProjectManagement", novo certificado ("pmp")); / * Adicionar registros de funcionários no banco de dados */ inteiro empid1 = me.addemployee ("manoj", "kumar", 4000, set1); / * Outro conjunto de certificados para o segundo funcionário */ Treemap set2 = new Treemap (); set2.put ("computerscience", novo certificado ("MCA")); set2.put ("Businessmanagement", novo certificado ("MBA")); / * Adicione outro registro do funcionário no banco de dados */ inteiro empid2 = me.addemployee ("dilip", "kumar", 3000, set2); / * Liste todos os funcionários */ me.listemployee (); / * Atualize os registros salariais do funcionário */ me.UpdateEmployee (empid1, 5000); / * Exclua um funcionário do banco de dados */ me.deleteemployee (empid2); / * Liste todos os funcionários */ me.listemployees (); } / * Método para adicionar um registro de funcionários no banco de dados * / public integer addEmployee (string fname, string lname, int salário, teemap cert) {session session = factory.openssion (); Transação tx = nulo; Inteiro funcionárioID = nulo; tente {tx = session.begIntransaction (); Funcionário do funcionário = novo funcionário (fname, lname, salário); Employee.SetCertificates (CERT); empregado = (inteiro) session.save (funcionário); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); E.PrintStackTrace (); } finalmente {session.close (); } retornar o funcionárioID; } / * Método para listar todos os detalhes dos funcionários * / public void listemployees () {Session Session = factory.opensssion (); Transação tx = nulo; tente {tx = session.begIntransaction (); Listar funcionários = session.createquery ("do funcionário"). List (); for (iterator iterator1 = funcionário.iterator (); iterator1.hasnext ();) {funcionário = (funcionário) iterator1.next (); System.out.print ("primeiro nome:" + funcionário.getfirstname ()); System.out.print ("Sobrenome:" + Employee.getLastName ()); System.out.println ("Salário:" + Employee.getSalary ()); STORDMAP <String, Certificado> MAP = FUNCHARE.GETCERTIFICATES (); para (map.entry <string, certificado> Entrada: map.entrySet ()) {System.out.print ("/tcertificate Type:" + Entry.getKey ()); System.out.println (", nome:" + (entradas.getValue ()). GetName ()); }} tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); E.PrintStackTrace (); } finalmente {session.close (); }} / * Método para atualizar o salário para um funcionário * / public void updateEmployee (número inteiro, salário int) {sessão session = factory.openssession (); Transação tx = nulo; tente {tx = session.begIntransaction (); Funcionário funcionário = (funcionário) session.get (funcionário.class, funcionário); funcionário.SetSalary (salário); session.Update (funcionário); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); E.PrintStackTrace (); } finalmente {session.close (); }} / * Método para excluir um funcionário dos registros * / public void DeLeteemployee (Integer Funcionário) {session Session = Factory.openssession (); Transação tx = nulo; tente {tx = session.begIntransaction (); Funcionário funcionário funcionário = (funcionário) session.get (funcionário.class, funcionário); session.Delete (funcionário); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); E.PrintStackTrace (); } finalmente {session.close (); }}} Compilar e executar:
Você pode ver que os certificados foram classificados na ordem oposta. Você pode tentar alterando o arquivo de mapeamento, basta definir o sort = "natural" e executar o programa e comparar os resultados.
$ java ManageEmployee
..... Várias mensagens de log serão exibidas aqui ......... Nome: Manoj Sobrenome: Kumar Salário: 4000 Tipo de certificado: ProjectManagement, Nome: PMP Certificado Tipo: Computerscience, Nome: MCA Tipo de certificado: Nome do Nome: MAPAFIRST Nome: Dilip Nome: KUMAR Salário: 3000 Tipo de Certificação, Certificado, McA McA McAs McAs. Salário Kumar: 5000 Tipo de certificado: ProjectmanGerget, Nome: PMP Certificado Tipo: Computerscience, Nome: MCA Tipo de certificado: Gerenciamento de Empresa, Nome: MBA
Se você verificar o funcionário e o formulário de certificado, registre -o:
mysql> selecione * do funcionário;
+----+--------------------+---------+| id | primeiro_name | Último nome | Salário |+------------------------------------+-------------+------------+| 74 | Manoj | Kumar | 5000 |+--------------------------------+---------+1 linha no conjunto (0,00 s)
mysql> selecione * do certificado;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------