Buscar..


Parámetros

Anotación Propósito
@Herencia Especifica el tipo de estrategia de herencia utilizada.
@DiscriminatorColumn Especifica una columna en la base de datos que se utilizará para identificar diferentes entidades en función de cierta ID asignada a cada entidad
@MappedSuperClass las súper clases asignadas no son persistentes y solo se utilizan para mantener el estado de sus subclases. Generalmente las clases abstractas de java están marcadas con @MapperSuperClass

Estrategia de herencia unida.

Un diagrama de clase de muestra basado en el cual veremos la implementación de JPA. introduzca la descripción de la imagen aquí

@Entity
@Table(name = "VEHICLE")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "VEHICLE_TYPE")
public abstract class Vehicle {

    @TableGenerator(name = "VEHICLE_GEN", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", allocationSize = 1)
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "VEHICLE_GEN")
    private int idVehicle;
    private String manufacturer;

    // getters and setters
}

TransporteVehicle.java

@MappedSuperclass
public abstract class TransportationVehicle extends Vehicle {

    private int loadCapacity;

    // getters and setters    
}

Truck.java

@Entity
public class Truck extends TransportationVehicle {

    private int noOfContainers;

    // getters and setters

}

PasajeroVehicle.java

@MappedSuperclass
public abstract class PassengerVehicle extends Vehicle {

    private int noOfpassengers;

    // getters and setters
}

Car.java

@Entity
public class Car extends PassengerVehicle {

    private int noOfDoors;

    // getters and setters    
}

Bike.java

@Entity
public class Bike extends PassengerVehicle {

    private int saddleHeight;

    // getters and setters

}

Código de prueba

/* Create EntityManagerFactory */
EntityManagerFactory emf = Persistence
        .createEntityManagerFactory("AdvancedMapping");

/* Create EntityManager */
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

transaction.begin();

Bike cbr1000rr = new Bike();
cbr1000rr.setManufacturer("honda");
cbr1000rr.setNoOfpassengers(1);
cbr1000rr.setSaddleHeight(30);
em.persist(cbr1000rr);

Car aventador = new Car();
aventador.setManufacturer("lamborghini");
aventador.setNoOfDoors(2);
aventador.setNoOfpassengers(2);
em.persist(aventador);

Truck truck = new Truck();
truck.setLoadCapacity(1000);
truck.setManufacturer("volvo");
truck.setNoOfContainers(2);
em.persist(truck);

transaction.commit();

El diagrama de la base de datos sería el siguiente. introduzca la descripción de la imagen aquí

La ventaja de la estrategia de herencia unida es que no desperdicia espacio de base de datos como en la estrategia de tabla única. Por otro lado, debido a las múltiples uniones involucradas para cada inserción y recuperación, el rendimiento se convierte en un problema cuando las jerarquías de herencia se vuelven amplias y profundas.

El ejemplo completo con la explicación se puede leer aquí



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow