サーチ…
パラメーター
注釈 | 目的 |
---|---|
@継承 | 使用される継承ストラテジのタイプを指定します。 |
@DiscriminatorColumn | 各エンティティに割り当てられた特定のIDに基づいて異なるエンティティを識別するために使用されるデータベース内の列を指定します |
@MappedSuperClass | マップされたスーパークラスは永続的ではなく、そのサブクラスの状態を保持するためにのみ使用されます。一般的に抽象Javaクラスは@MapperSuperClassでマークされています |
@DiscriminatorValue | @DiscriminatorColumnで定義された列で指定された値。この値は、エンティティのタイプを識別するのに役立ちます |
備考
単一テーブル戦略の利点は、エンティティの取得と挿入に複雑な結合を必要としない一方で、多くの列がNULL可能である必要があり、それらのためのデータがないためデータベース空間を無駄にすることです。
完全な例と記事はここにあります
単一テーブルの継承戦略
単一のテーブル継承戦略のためにVehicle階層の簡単な例を取ることができます。
抽象的な車両クラス:
package com.thejavageek.jpa.entities;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
@Entity
@Table(name = "VEHICLE")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@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;
public int getIdVehicle() {
return idVehicle;
}
public void setIdVehicle(int idVehicle) {
this.idVehicle = idVehicle;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
}
TransportableVehicle.javaパッケージcom.thejavageek.jpa.entities;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class TransportationVehicle extends Vehicle {
private int loadCapacity;
public int getLoadCapacity() {
return loadCapacity;
}
public void setLoadCapacity(int loadCapacity) {
this.loadCapacity = loadCapacity;
}
}
PassengerVehicle.java
package com.thejavageek.jpa.entities;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class PassengerVehicle extends Vehicle {
private int noOfpassengers;
public int getNoOfpassengers() {
return noOfpassengers;
}
public void setNoOfpassengers(int noOfpassengers) {
this.noOfpassengers = noOfpassengers;
}
}
Truck.java
package com.thejavageek.jpa.entities;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value = "Truck")
public class Truck extends TransportationVehicle{
private int noOfContainers;
public int getNoOfContainers() {
return noOfContainers;
}
public void setNoOfContainers(int noOfContainers) {
this.noOfContainers = noOfContainers;
}
}
Bike.java
package com.thejavageek.jpa.entities;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value = "Bike")
public class Bike extends PassengerVehicle {
private int saddleHeight;
public int getSaddleHeight() {
return saddleHeight;
}
public void setSaddleHeight(int saddleHeight) {
this.saddleHeight = saddleHeight;
}
}
Car.java
package com.thejavageek.jpa.entities;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value = "Car")
public class Car extends PassengerVehicle {
private int noOfDoors;
public int getNoOfDoors() {
return noOfDoors;
}
public void setNoOfDoors(int noOfDoors) {
this.noOfDoors = noOfDoors;
}
}
テストコード:
/* 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 avantador = new Car();
avantador.setManufacturer("lamborghini");
avantador.setNoOfDoors(2);
avantador.setNoOfpassengers(2);
em.persist(avantador);
Truck truck = new Truck();
truck.setLoadCapacity(100);
truck.setManufacturer("mercedes");
truck.setNoOfContainers(2);
em.persist(truck);
transaction.commit();
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow