jpa/hibernate继承注解

hibernate继承映射
以下测试是在mysql中进行的。

[size=large][color=blue]1、单表方式[/color][/size]
Animal.java

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="animalType")
@DiscriminatorValue("animal")
public class Animal {
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;
}
}


Cat.java

@Entity
@DiscriminatorValue("cat")
public class Cat extends Animal {

private String catName;

public String getCatName() {
return catName;
}
public void setCatName(String catName) {
this.catName = catName;
}
}


Dog.java

@Entity
@DiscriminatorValue(value="dog")
public class Dog extends Animal{
private String dogName;

public String getDogName() {
return dogName;
}
public void setDogName(String dogName) {
this.dogName = dogName;
}
}


TestJunit.java

@Test
public void testAnimal(){
Animal t = new Animal();
t.setName("animal");
session.saveOrUpdate(t);
}

@Test
public void testCat(){
Cat t = new Cat();
t.setName("cat");
t.setCatName("cat");
session.saveOrUpdate(t);
}

@Test
public void testDog(){
Dog t = new Dog();
t.setName("dog");
t.setDogName("dog");
session.saveOrUpdate(t);
}


对应生成的数据表是这样的
table---animal
[table]
|id|name|animalType|catName|dogName|
|1|animal|animal|null|null|
|2|cat|cat|cat|null|
|3|dog|dog|null|dog|
[/table]

[size=large][color=blue]2、join方式[/color][/size]
Animal.java

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Animal {
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;
}
}


Cat.java

@Entity
@PrimaryKeyJoinColumn(name="catId")
public class Cat extends Animal {

private String catName;

public String getCatName() {
return catName;
}
public void setCatName(String catName) {
this.catName = catName;
}
}


Dog.java

@Entity
@PrimaryKeyJoinColumn(name="dogId")
public class Dog extends Animal{
private String dogName;

public String getDogName() {
return dogName;
}
public void setDogName(String dogName) {
this.dogName = dogName;
}
}


TestJunit.java

@Test
public void testAnimal(){
Animal t = new Animal();
t.setName("animal");
session.saveOrUpdate(t);
}

@Test
public void testCat(){
Cat t = new Cat();
t.setName("cat");
t.setCatName("cat");
session.saveOrUpdate(t);
}

@Test
public void testDog(){
Dog t = new Dog();
t.setName("dog");
t.setDogName("dog");
session.saveOrUpdate(t);
}


对应生成的数据表是这样的
table---Animal
[table]
|id|name|
|1|animal|
|2|cat|
|3|dog|
[/table]

table---cat
[table]
|catId|catName|
|2|cat|
[/table]

table---dog
[table]
|dogId|dogName|
|3|dog|
[/table]


[size=large][color=blue]3、每个实体类对应一个数据表[/color][/size]
以下的测试中,Anamal.java中的主键生成策略需要注解成@GeneratedValue(strategy=GenerationType.TABLE),测试是在mysql数据库中进行的。
Animal.java

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Animal {
private int id;
private String name;

@Id
@GeneratedValue(strategy=GenerationType.TABLE)
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;
}
}


Cat.java

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Cat extends Animal {

private String catName;

public String getCatName() {
return catName;
}
public void setCatName(String catName) {
this.catName = catName;
}
}


Dog.java

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Dog extends Animal{
private String dogName;

public String getDogName() {
return dogName;
}
public void setDogName(String dogName) {
this.dogName = dogName;
}
}


TestJunit.java

@Test
public void testAnimal(){
Animal t = new Animal();
t.setName("animal");
session.saveOrUpdate(t);
}

@Test
public void testCat(){
Cat t = new Cat();
t.setName("cat");
t.setCatName("cat");
session.saveOrUpdate(t);
}

@Test
public void testDog(){
Dog t = new Dog();
t.setName("dog");
t.setDogName("dog");
session.saveOrUpdate(t);
}



对应生成的数据表是这样的
table---animal
[table]
|id|name|
|1|animal|
[/table]

table---cat
[table]
|id|name|catName|
|2|cat|cat|
[/table]

table---dog
[table]
|id|name|dogName|
|3|dog|dog|
[/table]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值