package org.dayatang.domain;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* 一种抽象实体类,提供ID和版本属性,以及基本的持久化方法
*
* @author yang
*
*/
@MappedSuperclass
public abstract class AbstractEntity extends BaseEntity {
private static final long serialVersionUID = 8882145540383345037L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Version
@Column(name = "version")
private int version;
/**
* 获得实体的标识
*
* @return 实体的标识
*/
@Override
public Long getId() {
return id;
}
/**
* 设置实体的标识
*
* @param id 要设置的实体标识
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获得实体的版本号。持久化框架以此实现乐观锁。
*
* @return 实体的版本号
*/
public int getVersion() {
return version;
}
/**
* 设置实体的版本号。持久化框架以此实现乐观锁。
*
* @param version 要设置的版本号
*/
public void setVersion(int version) {
this.version = version;
}
/**
* 将实体本身持久化到数据库
*/
public void save() {
getRepository().save(this);
}
/**
* 将实体本身从数据库中删除
*/
public void remove() {
getRepository().remove(this);
}
/**
* 根据实体类型和ID从仓储中获取实体
* @param <T> 实体类型
* @param clazz 实体的类
* @param id 实体的ID
* @return 类型为T或T的子类型,ID为id的实体。
*/
public static <T extends Entity> T get(Class<T> clazz, Serializable id) {
return getRepository().get(clazz, id);
}
/**
* 查找实体在数据库中的未修改版本
* @param <T> 实体类型
* @param clazz 实体的类
* @param entity 实体
* @return 实体的未修改版本。
*/
public static <T extends Entity> T getUnmodified(Class<T> clazz, T entity) {
return getRepository().getUnmodified(clazz, entity);
}
/**
* 根据实体类型和ID从仓储中加载实体(与get()方法的区别在于除id外所有的属性值都未填充)
* @param <T> 实体类型
* @param clazz 实体的类
* @param id 实体的ID
* @return 类型为T或T的子类型,ID为id的实体。
*/
public static <T extends Entity> T load(Class<T> clazz, Serializable id) {
return getRepository().load(clazz, id);
}
/**
* 查找指定类型的所有实体
* @param <T> 实体所属的类型
* @param clazz 实体所属的类
* @return 符合条件的实体列表
*/
public static <T extends Entity> List<T> findAll(Class<T> clazz) {
return getRepository().createCriteriaQuery(clazz).list();
}
/**
* 根据单个属性值以“属性=属性值”的方式查找实体
* @param <T> 实体所属的类型
* @param clazz 实体所属的类
* @param propName 属性名
* @param value 匹配的属性值
* @return 符合条件的实体列表
*/
public static <T extends Entity> List<T> findByProperty(Class<T> clazz, String propName, Object value) {
return getRepository().findByProperty(clazz, propName, value);
}
/**
* 根据多个属性值以“属性=属性值”的方式查找实体,例如查找name="张三", age=35的员工。
* @param <T> 实体所属的类型
* @param clazz 实体所属的类
* @param propValues 属性值匹配条件
* @return 符合条件的实体列表
*/
public static <T extends Entity> List<T> findByProperties(Class<T> clazz, Map<String, Object> propValues) {
return getRepository().findByProperties(clazz, NamedParameters.create(propValues));
}
}