mapeo objeto-relacional

 https://programmerclick.com/article/9393252182/

 https://www.adictosaltrabajo.com/2020/04/02/hibernate-onetoone-onetomany-manytoone-y-manytomany/

 Dependiendo de la lógica de negocio y cómo modelemos, se podrán crear relaciones unidireccionales o bidireccionales.

 rimero entendemos un sustantivo ORM, el nombre completo es ( Object Relational Mapping ), Es decir, mapeo objeto-relacional. La realización de ORM es mapear los datos en las tablas de la base de datos relacional en objetos y mostrarlos en forma de objetos, para que los desarrolladores puedan transformar las operaciones en la base de datos en operaciones en estos objetos. Hibernate se da cuenta exactamente de este tipo de pensamiento, ha llegado a la conveniencia de que el desarrollador realiza la operación a la base de datos con el pensamiento orientado a objetos.

 

 Mapeo de asociación uno a uno (uno a uno):

Una relación de par entre dos objetos, por ejemplo: Person-IdCard

Hay dos estrategias para lograr el mapeo de asociación uno a uno:

* Asociación de clave primaria: los dos objetos tienen el mismo valor de clave primaria para indicar una correspondencia uno a uno entre ellos; las tablas de la base de datos no tendrán campos adicionales para mantener la relación entre ellos, solo por la clave primaria de la tabla para Asociado Como se muestra a continuación:

Ejemplo:Conexión de ejemplo de asociación de clave primaria unidireccional unidireccional

* Asociación de clave externa única: la asociación de clave externa se usó originalmente para la configuración de muchos a uno, pero después de agregar la única restricción (Adoptar<many-to-one>Etiqueta para mapear, especificar múltiples extremosuniqueParatrue, Que limita la multiplicidad de múltiples extremos a uno) También se puede utilizar para indicar una relación de asociación uno a uno. De hecho, es un caso especial de muchos a uno. Como se muestra a continuación:


Ejemplo:Ejemplo de asociación de clave externa única unidireccional unidireccional

Nota: Debido a la escasa escalabilidad del mapeo de asociación de clave primaria uno a uno, deja de funcionar cuando cambian nuestras necesidades y queremos cambiarlo a uno a muchos, por lo que a menudo usamos asociaciones uno a uno. Las asociaciones de claves foráneas únicas resuelven problemas y rara vez utilizan asociaciones de claves primarias uno a uno.

2. Mapeo de asociación unidireccional de muchos a uno (muchos a uno):

Principio de mapeo de asociación de muchos a uno: se agrega una clave foránea a un extremo y apunta al otro extremo, como se muestra a continuación:


Código de mapeo clave——Agregue las siguientes asignaciones de etiquetas en varios extremos:

  1. <many-to-onename="group"column="groupid"/>

3、Mapeo uno a muchos

El principio del mapeo de asociación uno a muchos es el mismo que el del mapeo de asociación muchos a uno, y se agrega una clave foránea en el extremo muchos para apuntar a un extremo. Como se muestra a continuación (estudiantes y clases):


Nota: La diferencia entre este y muchos a uno es la relación de mantenimiento.

* La relación de mantenimiento de muchos a uno es: relación de muchos a uno. Con esta relación, uno puede cargarse cuando hay muchas cargas.

* La relación de mantenimiento de uno a muchos es: una relación de uno a muchos. Con esta relación, puede cargar más cuando carga uno.

Código de mapeo clave-Agregue la siguiente asignación de etiquetas en un extremo:

  1. <setname="students">
  2. <keycolumn="classesid"/>
  3. <one-to-manyclass="com.hibernate.Student"/>
  4. </set>

Defecto: porque muchos finesStudentNo seClassesExistencia (es decir,StudentSin mantenimiento conClassesRelación) tan salvadorStudentCampo de relaciónclassesidEs paranullSi configura el campo de relación como no vacío, no podrá guardar los datos. La solución común es utilizar la asignación de asociación bidireccional.6

4、Mapeo de uno a muchos a muchos

Mapeo de asociación de muchos a muchosAgregar una nueva tablaSolo complete la asignación básica, como se muestra a continuación:


Código de mapeo clave—— Puede agregar la siguiente asignación de etiquetas al usuario final:

  1. <setname="roles"table="t_user_role">
  2. <keycolumn="user_id"/>
  3. <many-to-manyclass="com.hibernate.Role"column="role_id"/>
  4. </set>

5、Asignación bidireccional de asociación uno a uno

En comparación con el mapeo uno a uno, debe agregar la etiqueta <one- to-one> a IdCard. No afecta, pero solo afecta la carga. Como se muestra a continuación:

Asignación de código de asignación de clave principal bidireccional uno a unoIdCardAgregue la siguiente asignación de etiquetas

  1. <one-to-onename="person"/>

Asignación de código de asignación de teclas de asignación de clave externa única bidireccionalIdCardAgregue la siguiente asignación de etiquetas

  1. <one-to-onename="person"property-ref="idCard"/>

Nota: La asociación de clave foránea única uno a uno se usa en ambas direcciones<one-to-one>Mapeo de etiquetas, debe especificarse<one-to-one>En la etiquetaproperty-refEl atributo es el nombre del campo de relación.

6、Asignación bidireccional de asociación uno a muchos (Muy importante

El propósito de adoptar el mapeo de asociación bidireccional de uno a muchos es principalmente para resolver los defectos de la asociación unidireccional de uno a muchos y no depender de la demanda.

Método de mapeo de asociación bidireccional uno a muchos:

* Use la etiqueta <key> en la colección en un extremo y agregue una clave foránea en el extremo múltiple

* Use etiquetas <many-to-one> en múltiples extremos

Nota:<key>Etiquetas y<many-to-one>Los campos agregados por la etiqueta siempre se mantienen, de lo contrario, los datos se confundirán

Código de mapeo clave:

Agregue la siguiente asignación de etiquetas al final de las clases:

  1. <setname="students"inverse="true">
  2. <keycolumn="classesid"/>
  3. <one-to-manyclass="com.hibernate.Student"/>
  4. </set>

Agregue la siguiente asignación de etiquetas al final del Estudiante:

  1. <many-to-onename="classes"column="classesid"/>

Notas:inverseAtributo

* El atributo inverso se puede usar para asociaciones bidireccionales de uno a muchos y de muchos a muchos. El atributo inverso predeterminado es falso. Si es falso, el extremo local puede mantener la relación. Si el inverso es verdadero, el extremo local no puede mantener la relación y quedará en el otro extremo para mantenimiento. Relación, fracaso local final. Entonces, para el mapeo de asociación de uno a muchos, generalmente mantenemos la relación en el lado múltiple y hacemos que el lado no sea válido.

* inversa es la inversión en la dirección de control y solo afecta el almacenamiento

7、Asignación bidireccional de asociación de muchos a muchos

El propósito de bidireccional es que ambos extremos se carguen entre sí. La diferencia de unidireccional de muchos a muchos es que dos vías deben agregar mapeo de etiquetas en ambos extremos. Tenga en cuenta que:

* El nombre de la tabla intermedia generada debe ser el mismo

* Los campos en la tabla intermedia generada deben ser los mismos

RoleCódigo de asignación de teclas laterales (función):

  1. <setname="users"table="t_user_role">
  2. <keycolumn="role_id"/>
  3. <many-to-manyclass="com.hibernate.User"column="user_id"/>
  4. lt;/set>

UserCódigo de mapeo de teclas (usuario):

  1. <setname="roles"table="t_user_role">
  2. <keycolumn="user_id"/>
  3. <many-to-manyclass="com.hibernate.Role"column="role_id"/>
  4. lt;/set>

Resumen: Para los siete tipos de mapeos de asociación anteriores, el más importante es el mapeo uno a muchos, ya que está más cerca de nuestra vida real. Por ejemplo, las aulas y los estudiantes pueden ser una relación típica de uno a muchos, y desarrollamos software Uno de los propósitos es resolver algunos problemas repetitivos en la vida y entregar esos problemas repetitivos a la computadora para ayudarnos a completarlos, a fin de mejorar la eficiencia de nuestro trabajo. En una palabra:La vida no puede vivir sin programación, la programación no puede vivir sin vida

Portal original: http://blog.csdn.net/smszhuang168/article/details/7761310

Agregue un poco de asignación de herencia a continuación

Mapeo de herencia: Es un modelo de datos que asigna la relación de herencia en el modelo de objetos. Existen 3 métodos de asignación: 1. El modelo de objetos se asigna a una tabla 2. Cada clase se asigna a una tabla 3. Cada clase de entidad se asigna a una tabla.

1、El modelo de objetos se mapea en una tabla

Mapear todas las clases en el modelo de objetos en una tabla

* Modelo de objeto







* Modelo de datos (t_animal)



  1. <class name="lee.com.animal" table="t_animal">
  2. <id name="id">
  3. <generator class="native"/>
  4. </id>
  5. <discriminator column="type" type="string"></discriminator>
  6. <property name="name"/>
  7. <property name="sex"/>
  8. <subclass name ="com.lee.Pig" discriminator-value="P">
  9. <property name="weight"></property>
  10. </subclass>
  11. <subclass name ="com.lee.Bird" discriminator-value="B">
  12. <property name="hight"></property>
  13. </subclass>
  14. </class>

Construir una tabla que se ajuste a las filas de grano grueso del diseño de la base de datos también es un método de mapeo común

2Cada clase se mapea en una tabla:

Archivo de mapeo:

  1. <class name="lee.com.animal" table="t_animal">
  2. <id name="id">
  3. <generator class="native"/>
  4. </id>
  5. <property name="name"/>
  6. <property name="sex"/>
  7. <joined-subclass name="com.lee.hibernate.Pig" table="t_pig">
  8. <key column="id"/>
  9. <property name="weight"/>
  10. </joined-subclass>
  11. <joined-subclass name="com.lee.hibernate.Bird" table="t_bird">
  12. <key column="id"/>
  13. <property name="higjt"/>
  14. </joined-subclass>
  15. </class>

3Cada clase de entidad se asigna a una tabla:

  1. <class name="lee.com.animal" table="t_animal" abstract="true">
  2. <id name="id">
  3. <generator class="assigned"/>
  4. </id>
  5. <property name="name"/>
  6. <property name="sex"/>
  7. <union-subclass name="com.lee.hibernate.Pig">
  8. <property name="weight"></property>
  9. </union-subclass>
  10. <union-subclass name="com.lee.hibernate.Bird">
  11. <property name="hight"/>
  12. </union-subclass>
  13. </class>

classUno deabstractLa propiedad se establece entrue, La clase padre no generará una tabla,Tenga en cuenta que la estrategia de generación de clave principal solo se puede asignar manualmente y no puede usar estrategias de incremento automático como UUID; de lo contrario, la ID de clase de entidad se duplicará


Mapeo de clave primaria compuesta:La asignación de clave primaria compuesta se divide en 2EspecieSituación:

1. Clave primaria compuesta basada en atributos de clase de entidad (Tanto el campo de clave primaria como el campo ordinario están en la misma clase de entidad. Tenga en cuenta que la clase de entidad de clave primaria compuesta debe ser un objeto serializado, es decir, implementar la interfaz serializable e implementar los métodos hashCode (), equals ().

En la clase de persona, los atributos fistName y lastName se usan como clave principal.

Eche un vistazo al archivo de mapeo:

  1. <class name="com.lee.Person" table="t_person">
  2. <composite-id>
  3. <key-property name="firtName" type="string"/>
  4. <key-property name="lastName" type="string"/>
  5. </composite-id>
  6. <property name="email"/>
  7. </class>


Clave primaria compuesta basada en la clase de clave primaria (El campo de la clave primaria se extrae por separado en una clase de entidad La clase de entidad donde se encuentra la clave primaria debe implementar la interfaz serializable y anular los métodos hashCode () y equals ().)


  1. <class name="com.lee.Person" table="t_person">
  2. <composite-id name="PersonPK">
  3. <key-property name="firtName" type="string"/>
  4. <key-property name="lastName" type="string"/>
  5. </composite-id>
  6. <property name="email"/>
  7. </class>



Mapeo de colección(Set,List,Array,Map)

Set:

  1. <class name="com.lee.Collection" table="t_collection">
  2. <id>
  3. <generator class="uuid"></generator>
  4. </id>
  5. <set name=setMapping table="t_set_mapping">
  6. <key column="id"/>
  7. <element type="string" column="set_values"/>
  8. </set>
  9. </class>



List:

  1. <class name="com.lee.Collection" table="t_collection">
  2. <id>
  3. <generator class="uuid"></generator>
  4. </id>
  5. <list name="listMapping" table="t_list_mapping">
  6. <key column="id"/>
  7. <list-index column="list_index"/>
  8. <element column="list_values" type="string"/>
  9. </list>
  10. </class>

Array:

  1. <class name="com.lee.Collection" table="t_collection">
  2. <id>
  3. <generator class="uuid"></generator>
  4. </id>
  5. <array name="arrayMapping" table="t_array_mapping">
  6. <key column="id"/>
  7. <list-index column="arrayIndex"/>
  8. <element column="arrayValues" type="string"/>
  9. </array>
  10. </class>

Mapping:

  1. <class name="com.lee.Collection" table="t_collection">
  2. <id>
  3. <generator class="uuid"></generator>
  4. </id>
  5. <map name="mapMapping" table="t_map_mapping">
  6. <key column="id"/>
  7. <map-key type="string" column="mapKey"/>
  8. <element type="string" column="mapValues"/>
  9. </map>
  10. </class>



Recomendación Inteligente

La espada se refiere a la oferta - Título 2

La primera idea se puede aplicar para espacio adicional, es decir, los resultados de reemplazo se almacenan en una nueva matriz de caracteres. Ser 2. No use espacio adicional, utilice directamente el ...

2018-04-11 Linux Aprendizaje

1.10-11-12 Instalación de PHP5 11.13 Instalación de PHP7 Reimpreso en: https://blog.51cto.com/9298822/2097119...

Implementación nativa de Ajax de la URL en el método xmlhttp.open ()

El método xmlhttp.open () se utiliza en la implementación del método nativo Ajax, donde la url se escribe directamente como la ruta configurada por el proyecto del servlet, a la q...

Spring Cache For Redis.

I. Resumen      Cache(Almacenamiento en caché) puede almacenar información de uso frecuente para que la información esté disponible de inmediato cada vez que...

React implementa cargando más

La actualización de la aplicación desplegable y la carga desplegable son efectos muy comunes. Hoy, intenté usar react para lograr la carga desplegable y hacer clic en el bot&oacut...

Comentarios

Entradas populares de este blog

reloj obs---datetime.lua

10 videojuegos gratis para aprender JavaScript en línea

Filtrando por fecha