Como estrutura ORM, o Hibernate também deve atender às nossas necessidades para implementar a associação entre tabelas. A implementação do hibernato no método da associação é muito simples. Vamos dar uma olhada na abordagem individual:
Sem mais delongas, vamos apenas fazer o upload do código:
Duas aulas de entidade, Dividor e Tpassport:
public class Tusser implementa serializável {private estático final serialversionuid = 1L; private int id; private Int Age; nome de string privado; passaporte privado TPassport; // omita método get/set} classe pública tpassport implementa serializável {private estático final serialversionuid = 1L; private int id; serial de sequência privada; private Int Expiry; Usuário privado de Divocante; // omita o método Get/Set}Vamos dar uma olhada nas diferenças entre o mapeamento de arquivos:
<hibernate-mapping package = "org.hibernate.tutorial.domain4"> <classe name = "tuser" tabela = "user4"> <id name = "id" column = "id"> <gerator/> </id> <names name = "name" type = "java.lang.string" column = "name"/>/> <bom./"name" colun = "idade"/> <one-one name = "passaporte" cascade = "all" Outer-join = "true"/> </class> </hibernate-mapping>
Aqui, vemos um novo rótulo, One-to-One, que mostra que a classe atual e a classe correspondente são individuais, a Cascade é um relacionamento em cascata, todos mostram que, independentemente da situação, ou seja, ao operar na classe Divro, o TPassport também executará operações correspondentes. Joga externa refere-se ao uso da instrução de junção externa.
Vejamos outro arquivo de mapeamento TPassport:
<hibernate-mapping package = "org.hibernate.tutorial.Domain4"> <classe name = "tpassport" tabela = "pasport4"> <id name = "id" column = "id"> <generator> <param name = "propriedade"> user </param> </generator> </d> <propriedades "" sérrios ""> name = "expiry" type = "java.lang.integer" column = "expiry"/> <one-one name = "user" restritivo = "true"/> </class> </hibernate-mapping>
Aqui nos concentramos no valor da classe do gerador. Indica a chave estrangeira de referência para o estrangeiro e qual referência é especificada por param, que indica o ID da classe de usuário de referência. Existe uma propriedade adicional restrita na tag individual, que diz a Hibernate que existe uma restrição de chave estrangeira na classe atual, ou seja, o ID da classe atual é gerado com base no ID do Dogador.
Vamos fazer o upload diretamente da classe de teste. Desta vez, a aula de teste não usou Junit, mas veio diretamente com o método principal:
public static void main (string [] args) {Configuration cfg = new Configuration (). Configure (); Sessionfactory sessfactory = cfg.buildSessionFactory (); Sessão session = sessionFactory.opensssion (); session.BegIntransaction (); Usuário do Divulgo = new Tuser (); user.setage (20); user.setName ("shuntest"); Passaporte tpassport = new tpassport (); passaporte.setexpiry (20); passaporte.setserial ("123123123"); passaporte.setUser (usuário); user.setPassport (passaporte); session.Save (usuário); session.gettransaction (). Commit (); }O código é muito simples, então não vou falar sobre isso. Vejamos isso principalmente aqui:
session.Save (usuário);
Por que chamamos apenas um salvamento aqui? O motivo é que a propriedade em cascata em nosso arquivo de mapeamento de Dividir é definida como todos, o que significa que, quando salvamos, atualizamos, excluímos, etc. No jugonete, o TPassport também executará operações correspondentes, para que não precisemos escrever sessão.Save (passaporte). Vemos o fundo:
Hibernate: Insira no usuário4 (nome, idade) valores (?,?) Hibernate: inserir no passaporte4 (valores de serial, expiração, id) (?,? ,?)Hibernate: Imprime duas declarações, provando que o Hibernate fez esse trabalho para nós.
public static void main (string [] args) {Configuration cfg = new Configuration (). Configure (); Sessionfactory sessfactory = cfg.buildSessionFactory (); Sessão session = sessionFactory.opensssion (); Usuário do Divulgo = (Dividir) session.load (Tuser.class, novo número inteiro (3)); System.out.println (user.getName ()+":"+user.getpassport (). GetSerial ()); } Aqui, consultamos a classe Dividir e obtemos o objeto TPassport. Associação de Chave Espanha
Agora, vamos dar uma olhada em associações individuais que fazem associações por meio de chaves estrangeiras.
Ainda é o mesmo que o exemplo: escrevemos duas aulas de entidade, TGROUP e TUSER
classe pública tgroup implementa serializável {private estático final serialversionuid = 1L; private int id; nome de string privado; Usuário privado de Divocante; // omita método de get/set} public class Tusser implementa serializável {private estático final serialversionuid = 1L; private int id; private Int Age; nome de string privado; Grupo de Tgroup privado; // omita o método Get/Set} Depois que a aula de entidade terminar, vamos dar uma olhada no arquivo de mapeamento:
<hibernate-mapping package = "org.hibernate.tutorial.Domain5"> <classe name = "tuser" tabela = "user5"> <id name = "id" column = "id"> <gerator/> </id> <names name = "name" type = "java.lang.string" column = "name"/>/> Column = "Age"/> <Many-to-one name = "group" column = "group_id" Única = "true"/> </s class> </hibernate-mapping>
Aqui vemos que a tag de muitos para um é usada em vez de um para um. Por que?
Não prestei muita atenção quando o usei antes. Enfim, eu poderia usá -lo. Mas depois de ler o livro de Xia Xin desta vez, finalmente entendi que, de fato, essa maneira de associação através de chaves estrangeiras é apenas uma maneira especial de muitos para um. Nós o limitamos através de exclusivo = "verdadeiro" que ele deve ter apenas um, ou seja, associação individual.
Em seguida, vamos dar uma olhada no arquivo de mapeamento do TGroup:
<hibernate-mapping package="org.hibernate.tutorial.domain5"> <class name="TGroup" table="group5"> <id name="id" column="id"> <generator /> </id> <property name="name" type="java.lang.String" column="name"/> <one-to-one name="user" property-ref="group" /> </class> </hibernate-mapping>
Aqui, observe que usamos um a um novamente, indicando que a entidade atual e o magonho são individuais. Aqui, não usamos muitos para um, mas especificamos qual atributo na entidade do Discovante associar o TGRoup atual da classe. Aqui, especificamos que o minimensionário está associado ao disputas por meio de atributos de grupo. Propriedade-Ref Especifica qual propriedade associar.
Vejamos a aula de teste abaixo:
classe pública hibernatetest {public static void main (string [] args) {configuration cfg = new Configuration (). configure (); Sessionfactory sessfactory = cfg.buildSessionFactory (); Sessão session = sessionFactory.opensssion (); session.BegIntransaction (); Grupo Tgroup = new TGROUP (); group.setName ("TestGroup"); Usuário do Divulgo = new Tuser (); user.setage (23); user.setName ("teste"); user.setGroup (grupo); group.setUser (usuário); session.Save (Grupo); session.Save (usuário); session.gettransaction (). Commit (); session.close (); }} Observe que nosso código precisa ser salvo duas vezes desta vez, porque eles têm correspondências correspondentes um para o outro. Salvar apenas um não causará nenhuma operação no outro. Portanto, precisamos ligar para a operação salva duas vezes. Finalmente, faça um envio.
Hibernate imprime a declaração:
Hibernate: Insira no grupo 5 (nome) valores (?) Hibernate: inserir no usuário5 (nome, idade, grupo_id) valores (?,? ,?)
Isso significa que armazenamos corretamente dois valores de objeto.
Escrevemos uma aula de teste extra para consultar:
public static void main (string [] args) {Configuration cfg = new Configuration (). Configure (); Sessionfactory sessfactory = cfg.buildSessionFactory (); Sessão session = sessionFactory.opensssion (); Usuário do Divulgo = (Dividir) session.load (Tuser.class, novo número inteiro (1)); System.out.println ("do usuário get Group:"+user.getGroup (). GetName ()); TGROUP GRUPO = (TGROUP) session.load (TGroup.class, novo número inteiro (1)); System.out.println ("do grupo get user:" + group.getUser (). GetName ()); session.close (); } Nós dois podemos obter o resultado correto, que mostra que podemos tirar os valores do outro através de dois objetos, atingindo nosso objetivo.
O TGROUP e o magonho usados neste exemplo são apenas exemplos. De fato, os usuários na vida real geralmente correspondem a vários grupos.