欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Hibernate實(shí)體對(duì)象繼承的三種方法

 更新時(shí)間:2017年06月14日 15:30:45   作者:elim168  
這篇文章主要介紹了Hibernate實(shí)體對(duì)象繼承的方法的相關(guān)資料,需要的朋友可以參考下

Hibernate實(shí)體對(duì)象繼承的方法

   hibernate繼承策略總共有三種,一種是共用一張表;一種是每個(gè)類一張表,表里面儲(chǔ)存子類的信息和父類的信息;還有一種是通過表連接的方式,每個(gè)類都有一張表,但是子類對(duì)應(yīng)的表只保存自己的信息,父類對(duì)應(yīng)的表保存父類的信息,它們之間通過子類表和父類表的關(guān)聯(lián)來獲取所有的信息。

第一種方式,即共用一張表:

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="discriminator", discriminatorType=DiscriminatorType.STRING)//表示區(qū)分不同的對(duì)象的字段名 
@DiscriminatorValue("person")//用來表示該對(duì)象是何種對(duì)象的,即區(qū)分器 
public class Parent { 
  private int id; 
  private String name; 
   
  @Id 
  @GeneratedValue 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
 
} 
 
@Entity 
@DiscriminatorValue("child1") 
public class Child1 extends Parent { 
  private String email; 
 
  public String getEmail() { 
    return title; 
  } 
 
  public void setEmail(String email) { 
    this.email = email; 
  } 
 
   
} 
 
 
 
@Entity 
@DiscriminatorValue("child2") 
public class Child2 extends Parent { 
   
  private String address; 
 
  public String getAddress() { 
    return score; 
  } 
 
  public void setAddress(String address) { 
    this.address = address; 
  } 
   
}  
    

 這種情況父類和所有子類的所有信息都保存在同一張表里面,通過我們指定的@DiscriminatorColumn對(duì)應(yīng)的@DiscriminatorValue來區(qū)別不同的類。 當(dāng)沒有指定@DiscriminatorValue的時(shí)候?qū)⑹褂萌惷麃碜鳛镈iscriminatorValue。

第二種策略是每個(gè)類一張表,保存所有信息:

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
@TableGenerator(    //一個(gè)類一張表,最重要的是要保證它們的id由一個(gè)生成器產(chǎn)生,@TableGenerator就是為了控制這個(gè)的 
    name="t_gen", 
    table="t_gen_table", 
    pkColumnName="t_pk", 
    valueColumnName="t_value", 
    pkColumnValue="person_pk", 
    initialValue=1, 
    allocationSize=1 
    ) 
public class Parent { 
  private int id; 
  private String name; 
   
  @Id 
  @GeneratedValue(generator="t_gen", strategy=GenerationType.TABLE)//這個(gè)就是用表生成器生成的,用同一個(gè)生成器就可以控制它們的id不重復(fù) 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
 
} 
 
 
@Entity 
public class Child2 extends Parent { 
   
  private String address; 
 
  public String getAddress() { 
    return score; 
  } 
 
  public void setAddress(String address) { 
    this.address = address; 
  } 
   
} 
 
 
@Entity 
public class Child1 extends Parent { 
  private String email; 
 
  public String getEmail() { 
    return title; 
  } 
 
  public void setEmail(String email) { 
    this.email = email; 
  } 
 
   
} 

弟三種方式是采用表連接的方式:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
 
public class Parent { 
  private int id; 
  private String name; 
   
  @Id 
  @GeneratedValue 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
 
} 
 
@Entity 
public class Child2 extends Parent { 
   
  private String address; 
 
  public String getAddress() { 
    return score; 
  } 
 
  public void setAddress(String address) { 
    this.address = address; 
  } 
   
} 
 
 
@Entity 
public class Child1 extends Parent { 
  private String email; 
 
  public String getEmail() { 
    return title; 
  } 
 
  public void setEmail(String email) { 
    this.email = email; 
  } 
 
   
} 

         采用表連接的情況,還是每個(gè)類擁有自己的一張表,只是子類對(duì)應(yīng)的表只保存子類的信息,其父類的信息由父類的表保存。當(dāng)需要獲取子類的完整信息時(shí)通過表連接的方式連接子類的表和父類的表獲取對(duì)應(yīng)信息。可以在子類的表上標(biāo)注@PrimaryKeyJoinColumn(name="foreignKeyName")指明子類表相對(duì)于父類表外鍵的名稱。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論