本节主要说明框架中实体类的关系,已经编写实体类的方式
1. 框架中实体类的目录结构
2. 打开AbstractEntity查看代码:
package com.hqhop.framework.common.entity;
import java.io.Serializable;
/**
* 抽象实体基类,如果主键是数据库端自动生成
*/
public abstract class AbstractEntity<ID extends Serializable> implements Serializable {
public abstract ID getId();
public abstract void setId(final ID id);
public boolean isNew() {
return null == getId();
}
@Override
public boolean equals(Object obj) {
if (null == obj) {
return false;
}
if (this == obj) {
return true;
}
if (!getClass().equals(obj.getClass())) {
return false;
}
AbstractEntity<?> that = (AbstractEntity<?>) obj;
return null == this.getId() ? false : this.getId().equals(that.getId());
}
@Override
public int hashCode() {
int hashCode = 17;
hashCode += null == getId() ? 0 : getId().hashCode() * 31;
return hashCode;
}
}
这类重写了equals,hashCode方法,通过实体类的id值来判断两个实体是否相等;AbstractEntity有一个泛型ID, 这个ID表示实体类id的类型;接下来看下AbstractEntity的实现类:
<pre name="code" class="java">@MappedSuperclass
public abstract class BaseEntity extends AbstractEntity<String> {
@Id
@GeneratedValue(generator = "uuidGen")
@GenericGenerator(name = "uuidGen", strategy = "uuid")
private String id;
@Override
public String getId() {
return id;
}
@Override
public void setId(String id) {
this.id = id;
}
}
在BaseEntity中配置了Id的生成策略,我这里使用的是uuid,所以在类声明的时候指定了AbstractEntity的ID为String , 这里的@MappedSuperclass也是必须的 ,否则在hibernate自动建表的时候会有问题
3. 接下来再看下实现逻辑删除的接口LogicDeleteable(也就是说我们不从数据库中删除数据,只是把数据标示为删除),类似的还提供了Movable(调整数据排序的接口),Stateable(状态接口),Treeable(树行结构,如:菜单)
package com.hqhop.framework.common.entity;
/**
* 实体实现该接口表示想要逻辑删除 为了简化开发 约定删除标识列名为deleted
*/
public interface LogicDeleteable {
public Boolean getDeleted();
public void setDeleted(Boolean deleted);
/**
* 标识为已删除
*/
public void markDeleted();
}
4. 如何使用这些基本的接口、实体类,建立User实体类:
package com.hqhop.framework.shiro.entity;
// import ....
@Entity
@DynamicUpdate(true)
@DynamicInsert(true)
@Table(name = "t_base_user")
public class User <span style="color:#ff0000;">extends BaseEntity implements LogicDeleteable</span> {
private String name;
private String password;
private int age;
private int sex;
private String identityCard;
private String phoneNum;
/**
* 职工号
*/
private String empNum;
<span style="color:#ff0000;">/**
* 逻辑删除flag
*/
private Boolean deleted = Boolean.FALSE;</span>
/**
* 系统用户的状态
*/
@Enumerated(EnumType.STRING)
private UserStatus status = UserStatus.normal;
@Column(name = "department_id")
private String departmentId;
<span style="color:#ff0000;">@Override
public Boolean getDeleted() {
return this.deleted;
}
@Override
public void setDeleted(Boolean deleted) {
this.deleted = deleted;
}
@Override
public void markDeleted() {
this.deleted = Boolean.TRUE;
}</span>
//get set ....
}
这样User 就已经有id的属性了,生成策略为uuid, 具有了逻辑删除的功能(如何实现后面讲解)