Podría alguien explicarme cómo Cualquier relacionadas con anotaciones (@Any, @AnyMetaDef, @AnyMetaDefs y @ManyToAny) el trabajo en la práctica. Tengo un tiempo difícil encontrar cualquier tipo de documentación (JavaDoc por sí sola no es muy útil) acerca de estos.

Que tengo hasta el momento se reunieron que de alguna manera permiten hacer referencia a lo abstracto y extendido de clases. Si este es el caso, ¿por qué no hay un @OneToAny anotación? Y es que este ‘ninguna’, refiriéndose a una sola ‘ninguna’, o múltiples ‘cualquier’?

Un corto, práctico y que ilustra ejemplo sería muy apreciado (no tiene que compilar).

Edición: tanto como me gustaría aceptar respuestas como las respuestas y dar el crédito debido, he encontrado tanto Smink y Sakana respuestas del informativo. Porque no puedo aceptar varias respuestas como la respuesta, yo por desgracia marca ni como la respuesta.

  • Me gustaría señalar que esta práctica es considerada una de SQL anti-patrón, de acuerdo con el proyecto de Ley Karwin libro.
InformationsquelleAutor Henrik Paul | 2008-10-20

4 Comentarios

  1. 25

    La esperanza de que este artículo trae un poco de luz al tema:

    A veces necesitamos un mapa
    la asociación de la propiedad a diferentes
    los tipos de entidades que no tienen una
    ancestro común de la entidad, por lo que un llano
    polimórfica de la asociación de no hacer el
    trabajo.

    Por ejemplo, supongamos que tres diferentes aplicaciones que permiten gestionar una biblioteca de medios de comunicación – la primera aplicación que gestiona los libros de préstamo, el segundo Dvd, y la tercera VHSs. Las aplicaciones no tienen nada en común. Ahora queremos desarrollar una nueva aplicación que gestiona todos los tres tipos de medios y reutiliza la salida del Libro, DVD, VHS y entidades. Desde el Libro, DVD, VHS y clases de vino de diferentes aplicaciones que no tienen ningún antepasado de la entidad – el ancestro común es java.lang.Objeto. Todavía nos gustaría tener uno Prestado entidad que puede referirse a cualquiera de los posibles tipo de medios.

    Para resolver este tipo de referencias que podemos utilizar cualquier asignación. esta asignación incluye siempre más de una columna: una columna incluye el tipo de la entidad que la actual asignado a la propiedad se refiere a que el otro se incluye la identidad de la entidad, por ejemplo si nos referimos a un libro que es la primera columna se incluyen un marcador de Libro tipo de entidad y el segundo se incluye el id del libro específico.

    @Entity
    @Table(name = "BORROW")
    public class Borrow{
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Any(metaColumn = @Column(name = "ITEM_TYPE"))
        @AnyMetaDef(idType = "long", metaType = "string", 
                metaValues = { 
                 @MetaValue(targetEntity = Book.class, value = "B"),
                 @MetaValue(targetEntity = VHS.class, value = "V"),
                 @MetaValue(targetEntity = DVD.class, value = "D")
           })
        @JoinColumn(name="ITEM_ID")
        private Object item;
    
         .......
        public Object getItem() {
            return item;
        }
    
        public void setItem(Object item) {
            this.item = item;
        }
    
    }
  2. 24

    La @Cualquier anotación define un polimórficos de la asociación a las clases de varias tablas. Este tipo de cartografía
    siempre se requiere de más de una columna. La primera columna contiene el tipo de la entidad asociada. El resto de
    columnas que sostienen el identificador. Es imposible especificar una restricción de clave externa para este tipo de asociación, por lo que
    este es, sin duda, no se entiende como la forma habitual de asignación (polimórficos) las asociaciones. Usted debe utilizar este
    sólo en casos muy especiales (por ejemplo. los registros de auditoría, datos de sesión del usuario, etc).
    El @Cualquier anotación describe la columna de la celebración de los metadatos de la información. Para vincular el valor de la
    la información de metadatos y un real tipo de entidad, El @AnyDef y @AnyDefs anotaciones se utilizan.

    @Any( metaColumn = @Column( name = "property_type" ), fetch=FetchType.EAGER )
    @AnyMetaDef(
        idType = "integer",
        metaType = "string",
        metaValues = {
            @MetaValue( value = "S", targetEntity = StringProperty.class ),
            @MetaValue( value = "I", targetEntity = IntegerProperty.class )
    } )
    @JoinColumn( name = "property_id" )
    public Property getMainProperty() {
        return mainProperty;
    }

    idType representa el destino de entidades identificador del tipo de propiedad y metaType el tipo de metadatos (generalmente de Cadena).
    Tenga en cuenta que @AnyDef puede ser mutualized y reutilizados. Se recomienda colocar como un paquete de metadatos en este
    caso.

    //on a package
    @AnyMetaDef( name="property"
    idType = "integer",
    metaType = "string",
    metaValues = {
    @MetaValue( value = "S", targetEntity = StringProperty.class ),
    @MetaValue( value = "I", targetEntity = IntegerProperty.class )
    } )
    package org.hibernate.test.annotations.any;
    //in a class
    @Any( metaDef="property", metaColumn = @Column( name = "property_type" ), fetch=FetchType.EAGER )
    @JoinColumn( name = "property_id" )
    public Property getMainProperty() {
        return mainProperty;
    }

    @ManyToAny permite polimórficos asociaciones a las clases de varias tablas. Este tipo de asignación requiere siempre
    más de una columna. La primera columna contiene el tipo de la entidad asociada. Las columnas restantes
    mantenga el identificador. Es imposible especificar una restricción de clave externa para este tipo de asociación, así que esto es más
    ciertamente, no se entiende como la forma habitual de asignación (polimórficos) las asociaciones. Usted debe utilizar este sólo en muy
    casos especiales (por ejemplo. los registros de auditoría, datos de sesión del usuario, etc).

    @ManyToAny(
    metaColumn = @Column( name = "property_type" ) )
    @AnyMetaDef(
        idType = "integer",
        metaType = "string",
        metaValues = {
    @MetaValue( value = "S", targetEntity = StringProperty.class ),
    @MetaValue( value = "I", targetEntity = IntegerProperty.class ) } )
    @Cascade( { org.hibernate.annotations.CascadeType.ALL } )
    @JoinTable( name = "obj_properties", joinColumns = @JoinColumn( name = "obj_id" ),
        inverseJoinColumns = @JoinColumn( name = "property_id" ) )
    public List<Property> getGeneralProperties() {

    Src: Hibernate annotations Guía de Referencia 3.4.0 GA

    Espero que ayude!

    • Sé que esto es como de 6 años de retraso, pero este último @ManyToAny bits de guarda de mi culo. No he visto que se menciona en ninguna parte y es casi la única manera de asignar una lista de los objetos heredan de una sola entidad.
    • Me gustaría poder como más de una vez
  3. 2

    La @Cualquier anotación define un polimórficos de la asociación a las clases de varias tablas, a la derecha, pero polimórficos asociaciones como estas son una de SQL anti-patrón! La razón principal es que usted no puede definir una FK restricción si la columna puede referirse a más de una tabla.

    Una de las soluciones, señaló Bill Karwin en su libro, es crear intersección de las tablas para cada tipo de «Cualquier», en lugar de utilizar una columna «tipo», y utilizando el único modificador para evitar duplicados. Esta solución puede ser un dolor para trabajar con JPA.

    Otra solución, también propuesto por Karwin, es crear un super-tipo de los elementos interconectados. Tomando el ejemplo de el préstamo de libros, DVD o VHS, podría crear un super tipo de Elemento, y hacer Libro, DVD y VHS heredar de Elemento, con la estrategia de la tabla combinada. Pedir prestado, señala el Artículo. De esta manera evitan completamente el FK problema. He traducido el libro de ejemplo para JPA continuación:

    @Entity
    @Table(name = "BORROW")
    public class Borrow{
    //... id, ...
    @ManyToOne Item item;
    //...
    }
    
    @Entity
    @Table(name = "ITEMS")
    @Inheritance(strategy=JOINED)
    public class Item{
      //id, ....
      //you can add a reverse OneToMany here to borrow.
    }
    
    @Entity
    @Table(name = "BOOKS")    
    public class Book extends Item {
      //book attributes
    }
    
    @Entity
    @Table(name = "VHS")    
    public class VHS extends Item {
      //VHSattributes
    }
    
    @Entity
    @Table(name = "DVD")    
    public class DVD extends Item {
      //DVD attributes
    }

Dejar respuesta

Please enter your comment!
Please enter your name here