基本的な注意事項
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>