日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java联合主键_hibernate联合主键映射(注解版)

發布時間:2024/7/23 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java联合主键_hibernate联合主键映射(注解版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、聯合主鍵的映射三種寫法

實體類:

package com.zhouwei.po;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.IdClass;

import javax.persistence.Table;

//聯合主鍵(通過id和name確定一個人)

@Entity

@Table(name="t_person")

@IdClass(PersonPK.class)

public class Person {

//private

PersonPK personPk;

@Id

private int id;

@Id

private String name;

private int age;

//@Id?//第一種方式

//@EmbeddedId 第二種方式

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

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;

}

}

主鍵類:

package com.zhouwei.po;

import java.io.Serializable;

//@Embeddable?//第一種方式

public class PersonPK implements

Serializable{

private int id;

private String name;

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;

}

}

1、繼承類表的映射三種寫法

* 一、把三個類設計為同一個表 加一個type字段用來標識是動物還是狗或者貓

* 缺點:大量冗余?好多的字段的值為空比如保存的是狗那所有貓的屬性都是為空的

第一種:

父類:Animal

@Entity

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)

//name是新加字段的名稱

//discriminatorType區別的字段類型 可以為int,char或String等

@DiscriminatorValue("animal")

//當為animal時存的區別值,即查詢type值為animal時即為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;

}

@Column(length=30)

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

子類:Dog

@Entity

@DiscriminatorValue("dog")

public class Dog extends Animal{

private String hari;

@Column(length=30)

public String getHari() {

return hari;

}

public void setHari(String hari) {

this.hari = hari;

}

}

子類:Cat

@Entity

@DiscriminatorValue("cat")

public class Cat extends Animal {

private String eye;

@Column(length=30)

public String getEye() {

return eye;

}

public void setEye(String eye) {

this.eye = eye;

}

}

Animal:

id

name

Dog

id

hair

Cat

id

eye

Dog和cat表中的id是作為外鍵關聯到Animal中的id

第二種:把三個類設計成對應的三張表

* 缺點:三張表的id不能自動生成,必須建立一個序列的表去存儲主鍵而

*

把這三張表的主鍵作為外鍵關聯到序列表(如果Oracle就不用這樣設計,因為Oracle里有序列)

第三種:把三個表設計成對應的三張表?與二不同的是子類表里只存儲自己的字段從父類繼承的字段不存儲

* 主鍵關聯到父類的主鍵(最優)

當插入一條數據進子類的表中時,會自動將對應的字段保存到父類表中 例子見下面的test

@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;

}

@Column(length=30)

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

Dog:

@Entity

@PrimaryKeyJoinColumn(name="dogId")

public class Dog extends Animal{

private String hari;

@Column(length=30)

public String getHari() {

return hari;

}

public void setHari(String hari) {

this.hari = hari;

}

}

Cat:

@Entity

@PrimaryKeyJoinColumn(name="catId")

public class Cat extends Animal {

private String eye;

@Column(length=30)

public String getEye() {

return eye;

}

public void setEye(String eye) {

this.eye = eye;

}

}

Test:

ts.begin();

Dog dog =

new Dog();

dog.setName("dog");

dog.setHari("red");

session.save(dog);

Cat cat =

new Cat();

cat.setName("cat");

cat.setEye("blue");

session.save(cat);

ts.commit();

存:

通過對子類屬性的保存自動將name和id保存到父類Animal的表中

刪:當刪除子類中某條數據 在父類中也會自動級聯刪除

總結

以上是生活随笔為你收集整理的java联合主键_hibernate联合主键映射(注解版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。