Hibernateアノテーションのサポート

 基本的な注意事項

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>

 

おすすめ

転載: blog.csdn.net/weixin_41237676/article/details/84679405