1. Mapeamento de combinação
A combinação é um caso especial de relações de associação e um relacionamento com o mais alto grau de acoplamento. O objeto principal e o subobjeto da combinação têm o mesmo ciclo de vida. Se o objeto principal morrer, o subobjeto também morrerá. Aqui usamos empregadores e usuários como exemplos. Usuários e empregadores têm atributos de informações de contato. Se você pensa da perspectiva de um objeto, geralmente atrai o modelo de objeto para um método de combinação para abstrair uma classe de informações de contato comum. Em seguida, as duas pessoas incluem objetos de informações de contato correspondentes. Ao enfrentar o modelo de objeto correspondente, seu exemplo de objeto é mostrado na figura abaixo:
Depois que o modelo de objeto combinado gera o modelo de relacionamento correspondente, a subclasse correspondente será incluída na tabela principal; portanto, a estrutura da tabela correspondente gerará os atributos correspondentes na tabela correspondente. A estrutura da tabela correspondente é a seguinte:
1.1 Classe de funcionários e arquivos de mapeamento
No modelo de objeto, há uma relação de inclusão entre funcionário e contato. Ao escrever código, você precisa incluir o objeto de contato no funcionário. O arquivo de mapeamento correspondente também precisa ter um mapeamento de objetos de contato. A tag <componente> precisa ser usada para indicar os objetos combinados e adicionar as propriedades do objeto à tag de objeto.
Listagem: funcionário.java. Além das propriedades básicas, o arquivo de classe também precisa ser embalado com objetos de contato, porque há uma relação de camada de inclusão entre eles.
pacote com.src.hibernate; Public classe funcionário {// Número de identificação private Int ID; public int getId () {return id; } public void setId (int id) {this.id = id; } // Nome do nome da string privada; public String getName () {Return Name; } public void setName (nome da string) {this.name = name; } // Entre em contato com o objeto privado entre em contato com o userContact; Public Contact getUserContact () {return userContact; } public void setUserContact (entre em contato com o userContact) {this.userContact = userContact; }}Listagem 2: funcionário.hbm.xml, adicione o arquivo de mapeamento correspondente. Os objetos combinados mapeados devem ser marcados com <componente> e adicionar os atributos do objeto correspondente à tag. O código específico é o seguinte:
<? xml versão = "1.0"?> <! Doctype hibernate-mapping público "-// Hibernate/hibernate mapeamento dtd 3.0 // pt" "http://hibernate.sourceforge.net/hibernate tabela = "t_employee"> <id name = "id"> <generator/> </id> <propriedade name = "name"/> <names name = "empregeecontact"> <propriedades name = "email"/> <names-mame = "endereço"/> <names name = "zipcode"/> <names/"contactTel--"/> </component>
1.2 Classe de usuário e arquivos de configuração
Listagem 3: User.java, sua estrutura de conteúdo é a mesma do empregado.java. Não vou dizer muito sobre os outros, veja o código:
pacote com.src.hibernate; public class Usuário {// Número de ID Private Int ID; public int getId () {return id; } public void setId (int id) {this.id = id; } // Nome do nome da string privada; public String getName () {Return Name; } public void setName (nome da string) {this.name = name; } // Entre em contato com o objeto privado entre em contato com o userContact; Public Contact getUserContact () {return userContact; } public void setUserContact (entre em contato com o userContact) {this.userContact = userContact; }}Listagem 4: user.hbm.xml, sua estrutura de conteúdo é a mesma do funcionário.hbm.xml e é usada principalmente para o uso da tag <componente>. É muito simples, e o código é o seguinte:
<? xml versão = "1.0"?> <! Doctype hibernate-mapping público "-// Hibernate/hibernate mapeamento dtd 3.0 // pt" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibermate-mapping.Net/nitor/ibernate tabela = "t_user"> <id name = "id"> <generator/generator/> </id> <propriedade name = "name"/> <componente name = "userContact"> <propriedade name = "email"/> <names-mame = "endereço"/> <names name = "zipcode"/> <name "/" contactTel "/> </> </component> <componente> <componente> <componente> <componente>
1.3 Classe contact.java
Não há nada para prestar atenção neste arquivo de classe. Você pode adicionar propriedades básicas e não precisa configurar mapeamentos correspondentes para esta classe, para que seu conteúdo seja bastante simples.
pacote com.src.hibernate; classe pública Contato {// Endereço de e -mail Private String email; public String getEmail () {retornar email; } public void setEmail (string email) {this.email = email; } // Endereço do endereço da sequência privada; public string getAddress () {retornar endereço; } public void setAddress (endereço da string) {this.address = endereço; } // Código de poste Private String ZIPCODE; public String getZipCode () {return zipCode; } public void setZipCode (string zipCode) {this.zipcode = zipCode; } // Número de contato String privada ContactTel; public String getContActTel () {return contactTel; } public void setContActTel (String contactTel) {this.contactTel = contactTel; }} 1.4 Gere resultados
Após a configuração do arquivo acima, a estrutura da tabela de banco de dados correspondente pode ser gerada. A instrução SQL gerada é a seguinte:
Tabela de gota se existe t_employee goto tabela se existe t_user crie tabela t_employee (id inteiro não nulo auto_incrent, nome varchar (255), email varchar (255), endereço varchar (255), zipcode varchar (255), contactTel varchar (255), zagueiro (id)), criação de tabela de automobilismo (255). Varchar (255), email Varchar (255), endereço Varchar (255), ZipCode Varchar (255), ContactTel Varchar (255), chave primária (ID))
A estrutura da tabela de banco de dados gerada é a seguinte:
2. Operação de dados
A estrutura da tabela obtida pela combinação de mapeamento é uma tabela completa; portanto, o método mais original pode ser implementado ao escrever e ler dados. Aqui também usamos os métodos de teste usados nos artigos anteriores para escrever e ler dados, que são o uso de métodos de salvar e carregar, veja abaixo para operações específicas.
2.1 Insira dados
Aqui, o usuário é usado como exemplo, e a operação de gravação do funcionário é a mesma do usuário. Ao escrever dados, dois objetos precisam ser criados, um é o objeto de contato e o outro é o objeto do usuário. Ao salvar, apenas o objeto do usuário precisa ser salvo e o objeto de contato correspondente será salvo em conjunto.
public void testSave1 () {// Declare a sessão da sessão sessão de objeto = null; tente {// obtenha o objeto sessão session = hibernateUtils.getSession (); // Abra a sessão session.begintransaction (); // Crie o objeto de conexão entre em contato com userContact = new contact (); userContact.setAddress ("Pequim"); userContact.setContActTel ("1243435"); userContact.setemail ("[email protected]"); userContact.SetzipCode ("ZipCode"); // Crie o usuário do usuário Usuário do objeto = new User (); user.setName ("Zhangsan"); user.setUserContact (UserContact); session.Save (usuário); // envia sessão session.gettransaction (). Commit (); } catch (Exceção e) {e.printStackTrace (); session.gettransaction (). rollback (); } finalmente {hibernateutils.closhessession (sessão); }} Declaração SQL gerada:
Insira no T_USER (nome, email, endereço, zipcode, contactTel) valores (?,?, ,? ,?)
Verifique a estrutura da tabela da seguinte forma:
2.2 Operação de leitura
Também usando o usuário como exemplo, as operações do funcionário são as mesmas do objeto do usuário. A operação de leitura é bastante simples, o código é o seguinte:
public void testLoad1 () {// Declare a sessão da sessão sessão de objeto = null; tente {// obtenha o objeto sessão session = hibernateUtils.getSession (); // Abra a sessão session.begintransaction (); // Obtenha o usuário do usuário Usuário do objeto = (Usuário) session.load (user.class, 1); System.out.println ("Nome do usuário:"+user.getName ()); // Envie a sessão session.gettransaction (). Commit (); } catch (Exceção e) {e.printStackTrace (); session.gettransaction (). rollback (); } finalmente {hibernateutils.closhessession (sessão); }}Os resultados correspondentes são gerados da seguinte forma:
Hibernate: selecione User0_.id como id0_0_, user0_.name como name0_0_, user0_.email como email0_0_, user0_.address como endereço0_0_, user0_.zipcode como zipcode0_0_, user0_.contacttel como contactel0_0_0 da TA_0_0_0_0_. Nome de usuário: Zhangsan
Iii. Exemplos abrangentes
Conta:
A conta pública da classe implementa serializável {private int id; dinheiro duplo privado; endereço privado Endereço; public int getId () {return id; } public void setId (int id) {this.id = id; } public Double getMoney () {Return Money; } public void setMoney (Double Money) {this.money = Money; } endereço público getAddress () {retornar endereço; } public void setAddress (endereço de endereço) {this.address = endereço; }} Endereço:
classe pública endereço implementa serializável {private string code; Private String City; Província de cordas privadas; public String getCode () {Código de retorno; } public void setCode (código da string) {this.code = code; } public string getCity () {return City; } public void setCity (string city) {this.city = city; } public string getProvince () {Província de retorno; } public void setProvince (Província de String) {this.province = Província; }} Conta.hbm.xml:
<? xml versão = "1.0" coding = "utf-8"?> <! Tools--><hibernate-mapping package="pojo"> <class name="Account" table="t_account" > <id name="id"> <column name="id"></column> <generator></generator> </id> <property name="money"> <column name="money"></column> </property> <component name="address"> <property name="code"> <column name = "code"> </olmon> </property> <propriedade name = "city"> <coluna name = "city"> </colun> </property> <propriedade name = "Província"> <name da coluna = "Província"> </olmon> </propriedade> </componente> </class> </hibernate-mapping>