2012-04-17 9 views
14

¿Ormlite admite estas tres estrategias de herencia?¿Tiene ormlite support inheritance?

  • tabla por jerarquía de clases
  • tabla por subclase mesa
  • por clase concreta

he encontrado this discussion on the ORMLite user group, pero no estoy seguro de que responde a mi pregunta.

Especialmente quiero usar "tabla por jerarquía de clases". Si no es compatible con el framework ormlite, haré una clase y olvidaré la herencia, pero preferiría usar la herencia.

Respuesta

9

ORMLite no es compatible automáticamente, no. No estoy seguro de que realmente leer el hilo se ha vinculado a porque es muy específica al respecto:

Lo que necesito es: Si tengo clase A como una superclase, y tengo subclases B directa y C , y ejecuto una consulta para todos los registros/objetos de clase A, quiero que todos los objetos de clase A, B y C sean devueltos.

Sí, ORMLite no hace esto y actualmente no tengo planes de respaldarlo. La complejidad de esto, a menos que esté equivocado sobre cómo lograr esto, está fuera de lo que yo diría que era "Lite". La forma en que Hibernate admite tales construcciones es mediante el uso de claves externas, tablas múltiples y combinaciones mágicas.

Esta pregunta da algunas ideas sobre cómo utilizar ORMLite para implementar la herencia:

1) Usted podría tener la clase A y una tabla asociada - por lo que no puede ser abstracta. Entonces podría tener B y C, que subclase A, y tener todos los campos As, cada uno en una tabla separada. A continuación, podría crear un DAO especial para una consulta que también para B y C y agregarlos a sus resultados para A.

2) Otra manera de hacerlo es usted podría hacer las clases B y C no sean subclases pero en su lugar tiene un objeto extraño a A. Luego puede consultar todo el As y algunos de ellos serían la parte A de B y la parte A de C y algunos A simplemente. También podría consultar Bs y C y usar el A DAO para actualiza y obtén los campos A que no podrías lanzar. A también podría tener algún tipo de enumeración que dijera si era A, B o C. También podría hacer algo de magia donde podría decir getSubClassObject(), si mirara la enumeración y consultara el dao B o C para el objeto asociado con la clave foránea correcta para el objeto A.

+0

Lo siento, tal vez no era lo suficientemente claro sobre el enlace. Pensé que tal vez ahora es una solución implementada, porque la publicación es de enero de 2011, pero gracias por su respuesta – Flow

+0

Np @Flow. Ese es otro voto para esa característica. Si desea ayudar a agregarlo a ORMLite, envíe algunos correos electrónicos en las listas de correo. – Gray

+0

Perdón por traer esto de vuelta, pero ¿esto significa que si la Clase B extiende la Clase A, no puede tener dos tablas diferentes, donde la Clase B usa propiedades de Clase A como columnas de la tabla B? – Maxrunner

32

ORMlite admite la herencia, pero no es compatible con la herencia estratigios.

A continuación se muestra un ejemplo de herencia con ORMLite.

crear una superclase abstracta eso no es una tabla de base de datos ORMLite pero tiene algunos campos de base de datos utilizadas por todas las subclases

public abstract class Event { 

    @DatabaseField(columnName="id", generatedId = true) 
    protected int _id; 

    @DatabaseField(columnName="name") 
    protected String name; 

    @DatabaseField(columnName="date") 
    protected Date date; 

    @DatabaseField(columnName="type") 
    protected String type; 

    public abstract void setName(String name); 
    public abstract void setDate(Date date); 
    public abstract void setType(String type); 
} 

2) Crear una clase que hereda y añadir algunos campos (eso es una tabla base de datos)

@DatabaseTable(tableName="atividade") 
public class Atividade extends Event { 

     @DatabaseField(columnName="ala") 
     protected String ala; 

     public String getAla() { 
       return ala; 
     } 

     public void setAla(String ala) { 
       this.ala = ala; 
     } 

     public Atividade(String name, Date date, String type, String ala) { 
       this.setName(name); 
       this.setDate(date); 
       this.setTipo(type); 
       this.setAla(ala); 
     } 

     Atividade(){ 
     } 

     @Override 
     public void setName(String name) { 
       this.name = name; 
     } 

     @Override 
     public void setDate(Date date) { 
       this.date = date; 
     } 

     @Override 
     public void setType(String type) { 
       this.type = type; 
     } 
} 

Espero que ayude!

+2

¡Muchas gracias por agregar esta respuesta! Esto es exactamente lo que quería hacer. – theblang

+1

Si tiene otra clase que extienda Evento, digamos Ejemplo. ¿Cómo consultas tanto para Atividade como para Example? – Bri6ko

+0

@ Bri6ko: escriba este problema como una nueva pregunta y remítalo aquí –