基本註解
package com.wang.vo;
import java.util.Date;
import javax.annotation.processing.Generated;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import org.hibernate.annotations.Formula;
@Entity
@Table(name="News_info")
public class News {
/**
* @Id:
* 主鍵標識
*/
@Id
@TableGenerator(name="tg" ,table="t_tg" ,pkColumnName="pkName" ,valueColumnName="kv")
@GeneratedValue(strategy=GenerationType.TABLE ,generator="tg")
private Integer id;
private String title;
private String content;
/**
* id is Param:
* 參數值由該類的id屬性提供
* Notice:
* value="(sql)"格式括號不能少
* 該屬性將不會參數字段(動態數據不會保存到數據庫中去)
*/
@Formula("(select concat(nt.title,nt.content) from News_info as nt where nt.id=id)")
private String fullContent;
/**
* 指定是否由數據庫生成數據
* Notice:
* 需要創建相應的觸發器(當執行INSERT UPDATE 觸發)
*/
@Generated("GenerationTime.ALWAYS")
@Column(name="dataByDatabase")
private String dataByDatabase;
/**
* 不會映射到數據列中
*/
@Transient
private String Transient;
/**
* 枚舉類型:
*/
@Enumerated(EnumType.STRING)
@Column(name="emunType")
private Season emunType;
@Lob
/**
* Notic:
* 該註解fetch指定bolb類型是否延時加載
* 該註解optional指定是否允許爲空
*/
@Basic(fetch=FetchType.EAGER)
private byte[] pic;
/**
* Notice:
* 指定日期屬性 date time timestamp
*/
@Temporal(TemporalType.DATE)
@Column(name="dateline")
private Date date;
...省略set get 方法
//無參構造器
public News() {
}
}
集合註解
package com.wang.vo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.persistence.*;
import org.hibernate.annotations.SortNatural;
@Entity
@Table(name="olds_info")
public class Olds {
/**
* @TableGenerator: 主鍵生成器
*
*/
@Id
@TableGenerator(name="tg" ,table="t_tg" ,pkColumnName="pkName" ,valueColumnName="kv")
@GeneratedValue(strategy=GenerationType.TABLE ,generator="tg")
private Integer id;
/**
* @ElementCollection:集合屬性指定 (targetClass可以不指定只是會降低性能)
* @CollectionTable:集合元素保存表指定(其中還指定了外鍵列,當主表爲聯合主鍵時需要指定多個外鍵)
* Notice:
* 定義是需要創建該屬性 否則NullPointerException
* 該屬性在主表中沒有字段,字段存在於集合元素表,其通過外鍵與之關聯
*/
@ElementCollection(targetClass=String.class)
@CollectionTable(name="school_info" ,joinColumns=@JoinColumn(name="school_id" , nullable=false))
@Column(name="school_name")
@OrderColumn(name="order_schools") //索引列
private List<String> schools = new ArrayList<>();
/**
* 數組與list集合基本相同
*/
@ElementCollection(targetClass=String.class)
@CollectionTable(name="arr_info" ,joinColumns=@JoinColumn(name="arr_id" ,nullable=false))
@OrderColumn(name="order_arr")
private String[] arr;
/**
* 無索引列,總是以外鍵列和元素列作爲聯合主鍵,所以需要設置@Column(name="sets" ,nullable=false)
* Notice:
* 此集合爲無序,也可以通過@OrderBy("sql") 進行自然排序@OrderBy(id desc)
*/
@ElementCollection(targetClass=String.class)
@CollectionTable(name="sets_info" ,joinColumns=@JoinColumn(name="sets_id" ,nullable=false))
@Column(name="sets" ,nullable=false)
private Set<String> sets = new HashSet<>();
/**
* 與前面集合類型基本相似
* Notice:
* 此處主鍵爲外鍵 + key(sorces_key)字段
*/
@ElementCollection(targetClass=Float.class)
@CollectionTable(name="sorces_info" ,joinColumns=@JoinColumn(name="sorces_id" ,nullable=false))
@MapKeyColumn(name="sorces_key")
@MapKeyClass(String.class)
@Column(name="sorces" ,nullable=false)
private Map<String,Float> sorces = new HashMap<>();
/**
* 爲有序集合先進入在前面.
* Notice:
* 此處主鍵爲外鍵 + name.
*/
@ElementCollection(targetClass=String.class)
@CollectionTable(name="name_info" ,joinColumns=@JoinColumn(name="name_id" ,nullable=false))
@Column(name="name" ,nullable=false)
@SortNatural
private SortedSet<String> name = new TreeSet<>();
...省略set get方法
public Olds() {
}
}
組件類註解
package com.wang.vo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.*;
@Entity
@Table(name="Custom_info")
public class Custom {
/**
* 組件作爲聯合主鍵
* Notice:
* 組件類需要實現 java.io.Serializable
* 重寫equals 和 hashcode 方法
*/
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="first",column=@Column(name="first_name",nullable=false)),
@AttributeOverride(name="last",column=@Column(name="last_name",nullable=false))
})
/*@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)*/
private _Name id;
/**
* 通過註解指定組件屬性(自定義類)
*/
@Embedded
@AttributeOverrides({
@AttributeOverride(name="first",column=@Column(name="_first_name")),
@AttributeOverride(name="last",column=@Column(name="_last_name"))
})
private Name name;
@ElementCollection(targetClass=Name.class)
@CollectionTable(
name="names_info"
,joinColumns= {@JoinColumn(name="names_id" , nullable=false)
,@JoinColumn(name="_names_id" , nullable=false)
})
@OrderColumn(name="order_names")
@Embedded
@AttributeOverrides({
@AttributeOverride(name="first",column=@Column(name="first_name")),
@AttributeOverride(name="last",column=@Column(name="last_name"))
})
private List<Name> names = new ArrayList<>();
/**
* 此處組件作爲Map value
* Notice:
* 註釋部分爲錯誤寫法 可能因爲其不知道修飾的爲key還是value
*/
@ElementCollection(targetClass=Name.class)
@CollectionTable(
name="csm_info"
,joinColumns= {@JoinColumn(name="csm_id" , nullable=false)
,@JoinColumn(name="_csm_id" , nullable=false)
})
@MapKeyColumn(name="csm_key")
@MapKeyClass(String.class)
/*@Embedded
@AttributeOverrides({
@AttributeOverride(name="first",column=@Column(name="first_name")),
@AttributeOverride(name="last",column=@Column(name="last_name"))
})*/
private Map<String,Name> csm = new HashMap<>();
/**
* 此處組件作爲Map key
* Notice:
* 此處Name的equals 和 hashcode 需要重寫
* 此處需注意主鍵不能太大否者該集合表會創建失敗
*/
@ElementCollection(targetClass=String.class)
@CollectionTable(
name="msc_info"
,joinColumns= {@JoinColumn(name="msc_id" ,nullable=false)
,@JoinColumn(name="_msc_id" ,nullable=false)
})
@MapKeyClass(_Name_.class)
@Column(name="msc_value")
private Map<_Name_,String> msc = new HashMap<>();
...省略 set get 方法
public Custom() {
}
}
組件類
import org.hibernate.annotations.Parent;
@Embeddable
public class Name implements Serializable{
private String first;
private String last;
/**
* 指定其所屬持久化類
*/
@Parent
private Custom parent;
...省略 set get 方法
public Name() {
}
public Name(String first, String last) {
this.first = first;
this.last = last;
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(null != obj&& obj.getClass() == Name.class) {
Name target = (Name)obj;
return target.getFirst().equals(getFirst())
&&target.getLast().equals(getLast());
}
return false;
}
@Override
public int hashCode() {
return getFirst().hashCode()*31
+ getLast().hashCode();
}
}
@Embeddable
public class _Name implements Serializable{
private String first;
private String last;
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getLast() {
return last;
}
public void setLast(String last) {
this.last = last;
}
public _Name() {
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(null != obj&& obj.getClass() == Name.class) {
Name target = (Name)obj;
return target.getFirst().equals(getFirst())
&&target.getLast().equals(getLast());
}
return false;
}
@Override
public int hashCode() {
return getFirst().hashCode()*31
+ getLast().hashCode();
}
}
@Embeddable
public class _Name_ {
public String min;
public String getMin() {
return min;
}
public void setMin(String min) {
this.min = min;
}
public _Name_() {
}
}
配置文件
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/bookdb?useSSL = false</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- 數據庫方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 數據庫自定生成表 -->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- 控制檯打印sql語句 -->
<property name="show_sql">true</property>
<!-- 格式化sql語句 -->
<property name="format_sql">true</property>
<!-- <mapping class="com.wang.vo.News"/>
<mapping class="com.wang.vo.Olds"/> -->
<mapping class="com.wang.vo.Custom"/>
<mapping class="com.wang.vo.Name"/>
<mapping class="com.wang.vo._Name"/>
</session-factory>
</hibernate-configuration>