1. 程式人生 > >碼農小汪-Hibernate學習6-hibernate中Annocation修飾屬性

碼農小汪-Hibernate學習6-hibernate中Annocation修飾屬性

對於現在使用註解的方式更流行起來,感覺使用這個挺不錯的學習這些屬性還是有幫助,我們理解很多東西。

我們可以先建立資料庫之後再進行,利用MyEclipse進行反向操作,產生javaBean實體,可以是註解的,可以是xml的。自己喜歡,但是自己還是要看的懂
前面的文章講解過了註解到底是怎麼回事

  • 不想再JavaBean中不想持久的儲存屬性
    @Transient adj.短暫的;轉瞬即逝的;臨時的;這個很正常但是還是一般情況下用的比較少,稍微瞭解就行了
@Entity
@Table(name="news_inf")
public class News
{
    // 訊息類的標識屬性
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; // 訊息標題 // @Column指定該屬性對映的列資訊,此處指定了列名、長度 @Column(name="news_title" , length=50) private String title; // 訊息內容 不儲存這個屬性 @Transient private String content; // id的setter和getter方法 public void
setId(Integer id) { this.id = id; } public Integer getId() { return this.id; } // title的setter和getter方法 public void setTitle(String title) { this.title = title; } public String getTitle() { return this.title; } // content的setter和getter方法
public void setContent(String content) { this.content = content; } public String getContent() { return this.content; } }
  • @Enumerated 列舉,列舉
    我們儲存的屬性不是普通的java型別,而是個列舉,可以使用這個去修飾實體的屬性
    除此之外我們的儲存到資料庫實體的時候,可能有兩種情況,儲存的是標號,或者為真正的字串。我們定義列舉這個註解的時候,有個value的值,有兩個屬性 EnumType.String EnumType,ORDINAL 數字
    如下:
public enum Season
{
    春季,夏季,秋季,冬季
}
@Enumerated(EnumType.ORDINAL) 儲存在資料庫實體的時候就是個數字
@Column(name="season")
private Season happenSeason;
  • 儲存圖片我們怎麼處理呢?方式!
    一種是將圖片轉化成二進位制資料流存入資料庫中。
    一種是儲存圖片的路徑,然後前臺讀取路徑去呼叫圖片。
    第二種方法實現上比較簡單,就是儲存路徑,然後根據路徑讀取對應的圖片顯示出來。
    第一種就比較麻煩,要先把圖片轉化成二進位制資料,讀取時就是從資料庫讀取對應資料再轉化成圖片顯示出來。
    使用@Lob @ Basic修飾大型的資料的屬性
    資料庫的底層從通常使用Blob和Clob型別的資料列來儲存資料,Hibernate也為了這種大型資料的值提供了支援,使用@Lob修飾這種大資料,當持久化資料為Byte[]型別的,底層為BLob
    當持久化資料為Char[]或者他的包裝類時候,底層採用Clob列進行修飾
    對於使用這種大資料型別,資料庫的花銷比較的大,我們可以讓屬性延遲載入,等到真的需要使用這個屬性的時候,我們在採取載入,在實體中增加@Basic:
    有兩個屬性,Fecth:指定是否延遲載入 FetchType.EAGER FetchType.LAYZE
    option:是否允許資料 為空

下面演示個@Lob儲存圖片的例子

@Lob
@Basic(fetch=FetchType.LAZY)
@Column(nullable=true)
private byte[] pic;

儲存資料流物件啊!是不是很簡單!
Person person = new Person();
person.setName("JetWang");
File file = new File("logo.jpg");
byte[] content = new byte[(int)file.length()];
new FileInputStream(file).read(content);
person.setPic(content);
// 儲存Person物件
sess.save(person);
  • 使用@Temporal adj.時間的;世俗的;暫存的;<語>表示時間的;
    對於java資料而言,時間型別就兩種,Date,Calendar。但是對於資料庫而言,表示時間的型別很多 date time datetime timestamp這樣的背景下,我們如何對映就成了個問題啦。所有這個屬性給了個value屬性,到底對映為什麼樣子的屬性呢?TemporalType.DATE….

  • 對映屬性集合
    集合屬性很常見,比如我們的考試成績就是個map,每個科目對應一個成績。
    不管使用哪種集合都統一使用@ElemntCollection 元素集合!翻譯到位澀
    有屬性,一個是Fetch.抓取策略,一個是targetClass。指定集合中元素的型別。可以不指定的,Hibernate會幫我們尋找。
    對於集合的屬性,總需要保持到一個數據表中,所以儲存資料表必須包含一個外來鍵的列,用於參看主鍵的列.
    外來鍵的列使用@JoinColumn 加入行,差不多外來鍵的感覺,進行對映

    Hibernate使用標準的@CollecttionTable註解儲存集合屬性的表,好像啊,對不對。
    這裡面有屬性:name表示資料表的名稱,JoinCloumns表示外來鍵的可能是聯合主鍵嘛。其他的用的少

Java的集合中,有序集合和無序集合

Set無序集合,沒得索引的
List,Map有序的集合,需要索引值得,所以需要對映索引列的

  • @OrderColumn 是用來我們的list集合和陣列
  • @MapkeyColumn 用於對映我們的Map索引,如果需要知道我們的Key的型別,可以使用@MapKeyClass
    @Id 
    @Column(name="perosn_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    // 標識屬性
    private Integer id;
    private String name;
    private int age;
    // 集合屬性,保留該物件關聯的學校
    @ElementCollection(targetClass=String.class)
    // 對映儲存集合屬性的表
    @CollectionTable(name="school_inf", // 指定表名為school_inf
        joinColumns=@JoinColumn(name="person_id" , nullable=false))//指明該表的外來鍵到底是目前這個表的哪個,也可以使用不一樣的名字,加一個referencedColumnName屬性,指定依賴當前的哪個一個列名
    // 指定儲存集合元素的列為 school_name,list中值儲存的值
    @Column(name="school_name")
    // 對映集合元素索引的列
    @OrderColumn(name="list_order")
    private List<String> schools
        = new ArrayList<>();


這個集合表中就會有三個屬性
person_id  list_order school_name 
集合的索引不能重複,所以前面兩個都是主鍵來著。
樂觀和悲觀的外來鍵。我記得我問過資料庫的老師,外來鍵的樂觀和悲觀之說,我們認為他們是外來鍵就行了,也沒必要直接的寫成外來鍵

其他的陣列,set都差不多,我就跟著書上貼個程式碼吧

    @Id @Column(name="person_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    // 標識屬性
    private Integer id;
    private String name;
    private int age;
    // 集合屬性,保留該物件關聯的學校
    @ElementCollection(targetClass=String.class)
    // 對映儲存集合屬性的表
    @CollectionTable(name="school_inf", // 指定表名為school_inf
        joinColumns=@JoinColumn(name="person_id" , nullable=false))
    // 指定儲存集合元素的列為 school_name
    @Column(name="school_name")
    // 對映集合元素索引的列
    @OrderColumn(name="array_order")
    private String[] schools;

Map比較特殊一點

    @ElementCollection(targetClass=Float.class)
    // 對映儲存集合屬性的表
    @CollectionTable(name="score_inf", // 指定表名為score_inf
        joinColumns=@JoinColumn(name="person_id" , nullable=false))
    @MapKeyColumn(name="subject_name")
    // 指定Map key的型別為String型別
    @MapKeyClass(String.class)
    // 對映儲存Map value的資料列
    @Column(name="mark")
    private Map<String , Float> scores
        = new HashMap<>();