Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Entity Inheritance
7KH -DYD 3HUVLVWHQFH VSHFLILFDWLRQ SURYLGHV WKUHH GLIIHUHQW ZD\V WR PDS DQ LQKHULWDQFH
KLHUDUFK\ WR D UHODWLRQDO GDWDEDVH
$ VLQJOH WDEOH SHU FODVV KLHUDUFK\
2QH WDEOH ZLOO KDYH DOO SURSHUWLHV RI HYHU\ FODVV LQ WKH KLHUDUFK\
$ WDEOH SHU FRQFUHWH FODVV
(DFK FODVV ZLOO KDYH D WDEOH GHGLFDWHG WR LW ZLWK DOO RI LWV SURSHUWLHV DQG WKH SURS
HUWLHV RI LWV VXSHUFODVV PDSSHG WR WKLV WDEOH
195
$ WDEOH SHU VXEFODVV
(DFK FODVV ZLOO KDYH LWV RZQ WDEOH (DFK WDEOH ZLOO KDYH RQO\ WKH SURSHUWLHV WKDW DUH
GHILQHG LQ WKDW SDUWLFXODU FODVV 7KHVH WDEOHV ZLOO QRW KDYH SURSHUWLHV RI DQ\ VXSHU
FODVV RU VXEFODVV
,Q WKLV FKDSWHU ZH XVH WKHVH WKUHH VWUDWHJLHV WR PDS WKH Employee FODVV KLHUDUFK\ GHILQHG
LQ )LJXUH
$V \RX FDQ VHH DOO WKH SURSHUWLHV IRU WKH Customer FODVV KLHUDUFK\ DUH KHOG LQ RQH WDEOH
SINGLECLASS_PERSON 7KH VLQJOH WDEOH SHU FODVV KLHUDUFK\ PDSSLQJ DOVR UHTXLUHV DQ DG
GLWLRQDO GLVFULPLQDWRU FROXPQ 7KLV FROXPQ LGHQWLILHV WKH W\SH RI HQWLW\ EHLQJ VWRUHG LQ
D SDUWLFXODU URZ RI SINGLECLASS_PERSON /HW¦V ORRN DW KRZ WKH FODVVHV ZLOO XVH DQQRWD
WLRQV WR PDS WKLV LQKHULWDQFH VWUDWHJ\
@Entity(name = "SINGLECLASS_PERSON")
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType =
DiscriminatorType.STRING)
@DiscriminatorValue("PERSON")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Person
{
@Id
@GeneratedValue
private Long id;
...
}
@Target(TYPE) @Retention(RUNTIME)
public @interface DiscriminatorColumn
{
String name( ) default "DTYPE";
DiscriminatorType discriminatorType( ) default STRING;
String columnDefinition( ) default "";
int length( ) default 10;
}
@Target(TYPE) @Retention(RUNTIME)
public @interface DiscriminatorValue
{
String value( )
}
@Target(TYPE) @Retention(RUNTIME)
public @interface Inheritance
{
InheritanceType strategy( ) default SINGLE_TABLE;
}
7KH strategy() DWWULEXWH GHILQHV WKH LQKHULWDQFH PDSSLQJ WKDW ZH¦UH XVLQJ 6LQFH ZH¦UH
XVLQJ WKH VLQJOH WDEOH SHU FODVV KLHUDUFK\ WKH SINGLE_TABLE HQXP LV DSSOLHG
:H FDQ QRZ H[WHQG WKLV EDVH LQWR D PRUH VSHFLDOL]HG Customer
@Entity(name = "SINGLECLASS_CUSTOMER")
@DiscriminatorValue("CUSTOMER")
public class Customer extends Person
{
private String street;
private String city;
private String state;
private String zip;
...
}
Customer URZV LQ WKH WDEOH ZLOO XVH D YDOXH RI "CUSTOMER" LQ WKH GLVFULPLQDWRU FROXPQ
)LQDOO\ ZH KDYH Employee
@Entity (name="SINGLECLASS_EMPLOYEE")
@DiscriminatorValue("EMPLOYEE")
public class Employee extends Customer
{
private Integer employeeId;
...
}
Advantages
7KH SINGLE_TABLE PDSSLQJ VWUDWHJ\ LV WKH VLPSOHVW WR LPSOHPHQW DQG SHUIRUPV EHWWHU
WKDQ DOO WKH LQKHULWDQFH VWUDWHJLHV 7KHUH LV RQO\ RQH WDEOH WR DGPLQLVWHU DQG GHDO ZLWK
7KH SHUVLVWHQFH HQJLQH GRHV QRW KDYH WR GR DQ\ FRPSOH[ MRLQV XQLRQV RU VXEVHOHFWV
ZKHQ ORDGLQJ WKH HQWLW\ RU ZKHQ WUDYHUVLQJ D SRO\PRUSKLF UHODWLRQVKLS EHFDXVH DOO GDWD
LV VWRUHG LQ RQH WDEOH
Disadvantages
2QH KXJH GLVDGYDQWDJH RI WKLV DSSURDFK LV WKDW DOO FROXPQV RI VXEFODVV SURSHUWLHV PXVW
EH QXOODEOH 6R LI \RX QHHG RU ZDQW WR KDYH DQ\ NOT NULL FRQVWUDLQWV GHILQHG RQ WKHVH
FROXPQV \RX FDQQRW GR VR $OVR EHFDXVH VXEFODVV SURSHUW\ FROXPQV PD\ EH XQXVHG
WKH SINGLE_TABLE VWUDWHJ\ LV QRW QRUPDOL]HG
2QH PDMRU GLIIHUHQFH EHWZHHQ WKLV VWUDWHJ\ DQG WKH SINGLE_TABLE VWUDWHJ\ LV WKDW QR
GLVFULPLQDWRU FROXPQ LV QHHGHG LQ WKH GDWDEDVH VFKHPD $OVR QRWLFH WKDW HDFK WDEOH
FRQWDLQV HYHU\ SHUVLVWHQW SURSHUW\ LQ WKH KLHUDUFK\ /HW¦V QRZ ORRN DW KRZ ZH PDS WKLV
VWUDWHJ\ ZLWK DQQRWDWLRQV
@Entity(name = "TABLEPERCLASS_PERSON")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Person
{
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
// Cannot accept default generation strategy for table-per-class
private Long id;
@Entity(name = "TABLEPERCLASS_CUSTOMER")
public class Customer extends Person
{
private String street;
private String city;
private String state;
private String zip;
...
}
@Entity(name = "TABLEPERCLASS_EMPLOYEE")
public class Employee extends Customer
{
private Integer employeeId;
...
}
1RWLFH WKDW WKH RQO\ LQKHULWDQFH PHWDGDWD UHTXLUHG LV WKH InheritanceType DQG WKLV LV
QHHGHG RQ RQO\ WKH EDVH Person FODVV
Advantages
7KH DGYDQWDJH WR WKLV DSSURDFK RYHU WKH SINGLE_TABLE VWUDWHJ\ LV WKDW \RX FDQ GHILQH
FRQVWUDLQWV RQ VXEFODVV SURSHUWLHV $QRWKHU SOXV LV WKDW LW PLJKW EH HDVLHU WR PDS D
SUHH[LVWLQJ OHJDF\ VFKHPD XVLQJ WKLV VWUDWHJ\
Disadvantages
7KLV VWUDWHJ\ LV QRW QRUPDOL]HG DV LW KDV UHGXQGDQW FROXPQV LQ HDFK RI LWV WDEOHV IRU
HDFK RI WKH EDVH FODVV¦V SURSHUWLHV $OVR WR VXSSRUW WKLV W\SH RI PDSSLQJ WKH SHUVLVWHQFH
PDQDJHU KDV WR GR VRPH IXQN\ WKLQJV 2QH ZD\ LW FRXOG EH LPSOHPHQWHG LV IRU WKH
FRQWDLQHU WR XVH PXOWLSOH TXHULHV ZKHQ ORDGLQJ DQ HQWLW\ RU SRO\PRUSKLF UHODWLRQVKLS
7KLV LV D KXJH SHUIRUPDQFH KLW EHFDXVH WKH FRQWDLQHU KDV WR GR PXOWLSOH URXQG WULSV WR
WKH GDWDEDVH $QRWKHU ZD\ D FRQWDLQHU FRXOG LPSOHPHQW WKLV VWUDWHJ\ LV WR XVH SQL
UNIONV 7KLV VWLOO ZRXOG QRW EH DV IDVW DV WKH SINGLE_TABLE VWUDWHJ\ EXW LW ZRXOG SHUIRUP
PXFK EHWWHU WKDQ D PXOWLVHOHFW LPSOHPHQWDWLRQ 7KH GRZQVLGH WR DQ SQL UNION LV WKDW
QRW DOO UHODWLRQDO GDWDEDVHV VXSSRUW WKLV 64/ IHDWXUH ,W LV SUREDEO\ QRW ZLVH WR SLFN WKLV
VWUDWHJ\ ZKHQ GHYHORSLQJ \RXU HQWLW\ EHDQV XQOHVV \RX KDYH JRRG UHDVRQ H J DQ
H[LVWLQJ OHJDF\ VFKHPD
:KHQ WKH SHUVLVWHQFH PDQDJHU ORDGV DQ HQWLW\ WKDW LV D VXEFODVV RU WUDYHUVHV D SRO\
PRUSKLF UHODWLRQVKLS LW GRHV DQ 64/ MRLQ RQ DOO WKH WDEOHV LQ WKH KLHUDUFK\ ,Q WKLV
PDSSLQJ WKHUH PXVW EH D FROXPQ LQ HDFK WDEOH WKDW FDQ EH XVHG WR MRLQ HDFK WDEOH ,Q
RXU H[DPSOH WKH JOINED_EMPLOYEE JOINED_CUSTOMER DQG JOINED_PERSON WDEOHV VKDUH
WKH VDPH SULPDU\ NH\ YDOXHV 7KH DQQRWDWLRQ PDSSLQJ LV TXLWH VLPSOH
@Entity(name="JOINED_PERSON")
@Inheritance(strategy=InheritanceType.JOINED)
public class Person
{
...
}
@Entity(name="JOINED_CUSTOMER")
public class Customer extends Person
{
...
@Entity(name = "JOINED_EMPLOYEE")
@PrimaryKeyJoinColumn (name="EMP_PK")
public class Employee extends Customer
{
...
}
7KH SHUVLVWHQFH PDQDJHU QHHGV WR NQRZ ZKLFK FROXPQV LQ HDFK WDEOH ZLOO EH XVHG WR
SHUIRUP D MRLQ ZKHQ ORDGLQJ DQ HQWLW\ ZLWK D JOINED LQKHULWDQFH VWUDWHJ\ 7KH
@javax.persistence.PrimaryKeyJoinColumn DQQRWDWLRQ FDQ EH XVHG WR GHVFULEH WKLV
PHWDGDWD
package javax.persistence;
7KH name() DWWULEXWH UHIHUV WR WKH FROXPQ FRQWDLQHG LQ WKH FXUUHQW WDEOH RQ ZKLFK \RX
ZLOO SHUIRUP D MRLQ ,W GHIDXOWV WR WKH SULPDU\ NH\ FROXPQ RI WKH VXSHUFODVV¦V WDEOH 7KH
referencedColumnName() LV WKH FROXPQ WKDW ZLOO EH XVHG WR SHUIRUP WKH MRLQ IURP WKH
VXSHUFODVV¦V WDEOH ,W FDQ EH DQ\ FROXPQ LQ WKH VXSHUFODVV¦V WDEOH EXW LW GHIDXOWV WR LWV
SULPDU\ NH\ ,I WKH SULPDU\ NH\ FROXPQ QDPHV DUH LGHQWLFDO EHWZHHQ WKH EDVH DQG VXE
FODVVHV WKHQ WKLV DQQRWDWLRQ LV QRW QHHGHG )RU LQVWDQFH WKH Customer HQWLW\ GRHV QRW
QHHG WKH @PrimaryKeyJoinColumn DQQRWDWLRQ 7KH Employee FODVV KDV D GLIIHUHQW SULPDU\
NH\ FROXPQ QDPH WKDQ WKH WDEOHV RI LWV VXSHUFODVVHV VR WKH @PrimaryKeyJoinColumn
DQQRWDWLRQ LV UHTXLUHG ,I FODVV KLHUDUFK\ XVHV D FRPSRVLWH NH\ WKHUH LV D
@javax.persistence.PrimaryKeyJoinColumns DQQRWDWLRQ WKDW FDQ GHVFULEH PXOWLSOH MRLQ
FROXPQV
package javax.persistence;
Disadvantages
,W GRHV QRW SHUIRUP DV ZHOO DV WKH SINGLE_TABLE VWUDWHJ\
Mixing Strategies
7KH SHUVLVWHQFH VSHFLILFDWLRQ FXUUHQWO\ PDNHV PL[LQJ LQKHULWDQFH VWUDWHJLHV RSWLRQDO
7KH UXOHV IRU PL[LQJ VWUDWHJLHV LQ DQ LQKHULWDQFH KLHUDUFK\ PD\ EH GHILQHG LQ IXWXUH
YHUVLRQV RI WKH VSHF
@Entity
@Table(name="CUSTOMER")
@Inheritance(strategy=InheritanceType.JOINED)
@AttributeOverride(name="lastname", column=@Column(name="SURNAME"))
public class Customer extends Person {
...
}
@Entity
@Table(name="EMPLOYEE")
6LQFH LW LV QRW DQ HQWLW\ WKH PDSSHG VXSHUFODVV GRHV QRW KDYH DQ DVVRFLDWHG WDEOH
$Q\ VXEFODVV LQKHULWV WKH SHUVLVWHQFH SURSHUWLHV RI WKH EDVH FODVV <RX FDQ
RYHUULGH DQ\ PDSSHG SURSHUW\ RI WKH PDSSHG FODVV E\ XVLQJ WKH
@javax.persistence.AttributeOverride DQQRWDWLRQ
<RX FDQ KDYH @MappedSuperclass DQQRWDWHG FODVVHV LQ EHWZHHQ WZR @Entity DQQRWDWHG
FODVVHV LQ D JLYHQ KLHUDUFK\ $OVR QRQDQQRWDWHG FODVVHV L H QRW DQQRWDWHG ZLWK
@Entity RU @MappedSuperclass DUH FRPSOHWHO\ LJQRUHG E\ WKH SHUVLVWHQFH SURYLGHU