Mapeamento de muitos para um
Muitas associações para um são as relações de associação mais comuns, onde um objeto pode ser associado a vários objetos. Por exemplo, um objeto de endereço idêntico pode estar associado a objetos de vários funcionários.
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_increment, First_Name Varchar (20) NULL padrão, Last_name Varchar (20) NULL NULL, Salário Int NULL, endereço int não nulo, chave primária (ID));
Além disso, muitos funcionários podem ter o mesmo endereço; portanto, essa associação pode ser apresentada usando muitas associações individuais. Armazenamos as informações relacionadas ao endereço em uma tabela separada com a seguinte estrutura:
Criar endereço da tabela (ID int não nulo auto_increntle, street_name varchar (40) nulo padrão, city_name varchar (40) nulo padrão, estate_name varchar (40) nulo padrão, zipcode varchar (10) nulo padrão, chave primária (id));
Crie tabelas RBDMs ao mesmo tempo e deixe -as se preparar para a próxima implementação.
Definir aula de Pojo:
Vamos implementar um funcionário da classe Pojo que será usado para manter variáveis do objeto e seu tipo de endereço com a tabela de funcionários.
importar java.util.*; Public Class Funcionário {private int id; String privada primeiro nome; string privada stringname; salário privado int; endereço privado Endereço; public funcionário () {} funcionário público (string fname, string lname, int salário, endereço de endereço) {this.firstname = fname; this.LastName = lname; this.salary = salário; this.address = endereço; } 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; } endereço público getAddress () {retornar endereço; } public void setAddress (endereço de endereço) {this.address = endereço; }}Precisamos definir a tabela de endereços correspondente para que o objeto de endereço possa armazenar e recuperar outra classe Pojo na tabela de endereços.
importar java.util.*; endereço público {private int id; String Street Private String; Private String City; Estado de String Private; Private String ZIPCODE; public Endereço () {} public Endereço (String Street, String City, String State, String ZipCode) {this.street = Street; this.city = city; this.state = state; this.zipcode = zipCode; } public int getId () {return id; } public void setId (int id) {this.id = id; } public string getStreet () {Return Street; } public void setStreet (String Street) {this.street = street; } public string getCity () {return City; } public void setCity (string city) {this.city = city; } public string getState () {retornar estado; } public void setState (State String) {this.state = state; } public string getZipCode () {return zipCode; } public void setZipCode (string zipCode) {this.zipcode = zipCode; }} Defina o arquivo de mapeamento de hibernato:
Desenvolva nosso arquivo de mapeamento que instrua o Hibernate como definir o mapa de classes para tabelas de banco de dados. Os elementos de processamento de <Many-to-One> serão usados para definir regras para estabelecer um relacionamento de muitos para um entre o funcionário e o endereço das entidades.
<? 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> <propriedade name = "primeironame" column = "First_name" type = "string"/> <names name = "startName" column = "last_name" type = ""/> <names) <nário "" Salary "Salary" "last_name" type = "" "/> <name) <nary" colun = "endereço" não-null = "true"/> </class> <classe name = "endereço" tabela = "endereço"> <meta attribute = "classe-description"> Esta classe contém o detalhe do endereço. </meta> <id name = "id" type = "int" column = "id"> <gerator/> </id> <propriedade name = "street" column = "street_name" type = "string"/> <propriedades name = "city" column = "city_name" type = "string"/> <nome do nome = "estadual" ""_name = "name" "," string ") colun = "zipcode" type = "string"/> </class> </hibernate-mapping>
O formato <SCLASSNAME> .hbm.xml no arquivo de mapeamento que deve ser salvo. Salve o arquivo FILECOLHAR.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 valor da chave primária no elemento <gerator> dentro do elemento ID é usado para gerar automaticamente. Defina o atributo de classe do elemento gerado para permitir que o hibernato retire os algoritmos de se é 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 de processamento <fast-to-one> é usado para definir o relacionamento entre o funcionário e a entidade que endereço. O atributo de nome é definido como uma variável definida na classe pai, no nosso caso, é o endereço. O atributo da coluna é usado para nomes de colunas no conjunto de funcionários da tabela pai.
Por fim, criaremos o método principal () da classe de aplicativo para executar o aplicativo. Usaremos este aplicativo para salvar alguns funcionários junto com seu endereço para registrar seu endereço e, em seguida, solicitaremos a operação CRUD no registro.
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 objeto de endereço */ endereço de endereço = me.addaddress ("kondapur", "hyderabad", "ap", "532"); / * Adicionar registros de funcionários no banco de dados */ inteiro empid1 = me.addemployee ("manoj", "kumar", 4000, endereço); / * Adicione outro registro do funcionário no banco de dados */ inteiro empid2 = me.addemployee ("dilip", "kumar", 3000, endereço); / * 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 endereço no banco de dados * / endereço público endereço (String Street, String City, String State, String zipCode) {session session = Factory.opensssion (); Transação tx = nulo; Inteiro ADDEREDID = NULL; Endereço Endereço = NULL; tente {tx = session.begIntransaction (); endereço = novo endereço (rua, cidade, estado, zipcode); addressId = (inteiro) session.Save (endereço); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); E.PrintStackTrace (); } finalmente {session.close (); } endereço de retorno; } / * Método para adicionar um registro de funcionários no banco de dados * / public integer addEmployee (string fname, string lname, salário int, endereço de endereço) {sessão session = factory.openssion (); Transação tx = nulo; Inteiro funcionárioID = nulo; tente {tx = session.begIntransaction (); Funcionário funcionário funcionário = novo funcionário (fname, lname, salário, endereço); 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 iterator = funcionário.iterator (); iterator.hasnext ();) {funcionário = (funcionário) iterator.next (); System.out.print ("primeiro nome:" + funcionário.getfirstname ()); System.out.print ("Sobrenome:" + Employee.getLastName ()); System.out.println ("Salário:" + Employee.getSalary ()); Endereço add = funcionário.getAddress (); System.out.println ("endereço"); System.out.println ("Street:" + add.getstreet ()); System.out.println ("City:" + Add.getCity ()); System.out.println ("estado:" + add.getState ()); System.out.println ("zipCode:" + add.getzipCode ()); } 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 = (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:
Aqui estão as etapas para compilar e executar o aplicativo acima. Verifique se o caminho e o caminho de classe estão definidos adequadamente antes de compilar e executar.
Obtenha os seguintes resultados na tela e os registros são criados nas tabelas de funcionários e endereços.
$ java ManageEmployee
.....VARIOUS LOG MESSAGES WILL DISPLAY HERE.........First Name: Manoj Last Name: Kumar Salary: 4000Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532First Name: Dilip Last Name: Kumar Salary: 3000Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532First Name: Manoj Last Name: Kumar Salary: 5000Address Rua: Kondapur City: Hyderabad State: AP ZipCode: 532
Se você verificar o funcionário e a tabela de endereços, registre -o:
mysql> selecione * do funcionário;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql> selecione * do endereço;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Mapeamento individual
Um mapeamento individual pode ser implementado usando um conjunto de coleções Java que não contêm elementos duplicados. Vimos como definir mapas no Hibernate; portanto, se você aprendeu sobre mapeamentos de conjuntos, todas as configurações podem ser usadas para mapeamentos um para muitos.
O conjunto é mapeado para o elemento <Set> na tabela de mapas e é inicializado em java.util.hashset. Você pode usar coleções de set em uma classe, com um elemento na coleção que não requer duplicação.
Ainda usamos as classes RDBMS e POJO definidas no exemplo acima.
Defina o arquivo de mapeamento de hibernato:
Vamos instruir a Hibernate como definir uma classe mapeada para o arquivo de mapeamento de uma tabela de banco de dados.
<? 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> <set name = "certificados" cascade = "all"> <key column = "funcionário_id"/> <hebro-to-many/> </Set> <names name "nome" name "=" tound = "" thenname "string/" string/> </set> <names dinames "=" column = "primeiro_name" type = " type = "string"/> <propriedade name = "salário" column = "salário" type = "int"/> </class> <classe name = "certificado" tabela = "certificado"> <meta attribute = "classe-decription"> Esta classe contém os registros 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 do arquivo.hbm.xml no arquivo de mapeamento. Você já está familiarizado com a maioria dos detalhes do mapeamento, mas vamos ver todos os elementos do 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 para permitir que o hibernato colhe identidade, sequência ou algoritmos 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 <Set> define o relacionamento entre o certificado e a classe de funcionários. Utilizamos o elemento <Set> no atributo Cascade para informar ao Hibernate para salvar o objeto de certificado e também ser o objeto do funcionário. O atributo de nome é definido para o conjunto de variáveis definidas na classe pai, em nosso exemplo é o certificado. Para cada conjunto de variáveis, precisamos definir um conjunto separado de elementos no arquivo de mapeamento.
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 certificados.
Crie uma classe de aplicativo:
Por fim, criaremos o método principal () da classe de aplicativo para executar o aplicativo. Usaremos este aplicativo para salvar alguns funcionários junto com o certificado de registro e, em seguida, aplicaremos o registro de operação CRUD.
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 */ hashset set1 = new HashSet (); set1.add (novo certificado ("MCA")); set1.add (novo certificado ("MBA")); set1.add (novo certificado ("MBA")); set1.add (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 */ hashset set2 = new HashSet (); set2.add (novo certificado ("BCA")); set2.add (novo certificado ("ba")); / * 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.listemployee (); } / * Método para adicionar um registro de funcionários no banco de dados * / public integer addEmployee (string fname, string lname, int salário, set cert) {sessão session = factory.opensession (); Transação tx = nulo; Inteiro funcionárioID = nulo; tente {tx = session.begIntransaction (); Funcionário funcionário 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 ()); Set certificados = funcionário.getCertificates (); for (iterator iterator2 = certificates.iterator (); iterator2.hasnext ();) {certificado certname = (certificado) iterator2.next (); System.out.println ("certificado:" + certname.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 = (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:
$ java ManageEmployee
..... Várias mensagens de log serão exibidas aqui ......... Nome: Manoj Sobrenome: Kumar Salário: 4000Certificate: MBacertificate: PMPCertificate: McAfirst Nome: Dilip Sobrenome Kumar Salário: 3000Certificate: Bcacertificate: Bafirst Nome: Manoj Nome: KUMARRÁRIO DO MORNO: KUMARTIFICATIVOS: 5 ° KumertIt: Bcacertificate: Bafirst Nome: Manoj Nome: KUMAR SALARYS SALARTIL
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 |+------------------------------------+------------+----------+| 1 | Manoj | Kumar | 5000 |+--------------------------------+---------+1 linha no conjunto (0,00 s)
mysql> selecione * do certificado;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------