JDK基本类型
- @Transient:用于将某个属性设为瞬时,其不会被映射到数据库,默认的所有属性都将映射到数据库
- @Access:用于设置访问属性的策略,当值为@Access(AccessType.PROPERTY)时使用setter,否则使用field。可用于类/具体属性上
- @Column:用于进行属性-列名映射以及指定约束(非空、唯一、是否可更新等)
- @Formula:用于在query时,从数据库取值设置,对于update/save/insert无效
@org.hibernate.annotations.Formula("(select avg(b.AMOUNT) from BID b where b.ITEM_ID = ID)")
protected BigDecimal averageBidAmount;
- @ColumnTransformer:用于进行实体属性存入/取出数据库的转换,在作为HQl查询时也会自动转换
@Column(name = "IMPERIALWEIGHT")
@org.hibernate.annotations.ColumnTransformer(
read = "IMPERIALWEIGHT / 2.20462",
write = "? * 2.20462"
)
protected double metricWeight;
- @org.hibernate.annotations.Generated:自动生成属性,用户不应该指定
@Temporal(TemporalType.TIMESTAMP)
@Column(insertable = false, updatable = false)
@org.hibernate.annotations.Generated(
//永远使用最晚修改的时间
org.hibernate.annotations.GenerationTime.ALWAYS
)
protected Date lastModified;
- @Temporal:精确控制时间
- @Enumerated(EnumType.STRING):映射一个枚举类型
- @Lob:用于映射大值类型,具体为String、char[] --> clob;serilizable、byte[] --> blob;byte[]默认不注解即映射到clob
- java.util.Date保存后(save)再加载(get),将不再返回java.util.Date,而是java.sql.*,所以不再适合调用equals()比较,可以自定义转换器将java.sql.*转为java.util.Date
自定义值类型(@Embeddable取代@Entity,@Embedded+@AttributeOverrides取代@Column)
- 多个自定义值类型可以使用@Embeded进行多级嵌入,甚至于可以不使用@Embedded
- 当某个自定义嵌入的实例域X其对应的所有的属性均为null,则getX()将返回null,即setX(new X())不产生效果
- @AttributeOverride(name="a.b.text",column = @Column()) ---> 多级重写属性
自定义类型转换器(类 -> 数据库)
- JPA:实现AttributeConverter接口,缺点时只能映射到一列而且select * from i where i.monetaryamount.monry > 100将错误,因为整个monetaryamount映射成一个String
//若未使用autoApply,可以在转换的具体实例域使用@Converte
@Converter(autoApply = true)
public class MonetaryAmountConverter implements AttributeConverter {
@Override
public String convertToDatabaseColumn(MonetaryAmount monetaryAmount) {
return monetaryAmount.toString();
}
@Override
public MonetaryAmount convertToEntityAttribute(String s) {
return MonetaryAmount.fromString(s);
}
}
//DynamicParameterizedType:(用于获得注解/表名等运行时参数)
public class DateUserType implements DynamicParameterizedType{
@Override
public void setParameterValues(Properties parameters) {
//获得配置的表名/列名等信息
ParameterType pt = (ParameterType) parameters.get(PARAMETER_TYPE);
String table = pt.getTable();
String[] columns = pt.getColumns();
//获得传递的参数,使用@org.hibernate.annotations.TypeDef()的parameters设置
String value = parameters.getProperty("parameterName");
}
}
//CompositeUserType:用于实际加载、缓存控制对象等
public class DateUserType implements CompositeUserType{
//最重要的两个方法,分别实现了从数据加载对象,和写对象到数据库。
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
if(rs.wasNull()){
return null;
}
String firstField = rs.getString(names[0]);
String secondField = rs.getString(names[1]);
return new MyClass(firstField,secondField);
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
st.setObject(index,value);
}
//按顺序返回实例域名
@Override
public String[] getPropertyNames() {
return new String{"firstFieldName","secondFieldName"};
}
//按顺序返回映射到数据库的数据库类型
@Override
public Type[] getPropertyTypes() {
return new Type[]{StandardBasicTypes.DATE,StandardBasicTypes.INT};
}
//获得对象对应的位置的属性值
@Override
public Object getPropertyValue(Object component, int property) throws HibernateException {
MyClass mc = (MyClass)component;
if(index == 0){
return mc.getFistField();
}else if(index == 1){
return mc.getSecondField();
}else{
return null;
}
}
//给对象对应位置的属性设置值
@Override
public void setPropertyValue(Object component, int property, Object value) throws HibernateException {
if(value == null){
st.setNull(index,StandardBasicTypes.CHARACTER.sqlType());
st.setNull(index+1,StandardBasicTypes.CHARACTER.sqlType());
}else{
MyClass mc = (MyClass)value;
st.setString(index,mc.getFisrtField());
st.setString(index,mc.getSecondField());
}
}
//自定义转换的类.class
@Override
public Class returnedClass() {
return MyClass.class;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
return false;
}
@Override
public int hashCode(Object x) throws HibernateException {
return 0;
}
@Override
public Object deepCopy(Object value) throws HibernateException {
return null;
}
@Override
public boolean isMutable() {
return true;
}
//以下两个方法用于二级缓存
@Override
public Serializable disassemble(Object value, SessionImplementor session) throws HibernateException {
return (Serializable)value;
}
@Override
public Object assemble(Serializable cached, SessionImplementor session, Object owner) throws HibernateException {
return cached;
}
//用于merge,把target的更新属性拷贝至original
@Override
public Object replace(Object original, Object target, SessionImplementor session, Object owner) throws HibernateException {
return null;
}
}
使用时,在package-info.java中使用@TypeDef定义类型,并传入对应的参数。
在具体的实例域使用@Type进行使用