1. 1. Hibernate通过@Id指定主键来表示实体的同一性,@Id注解的位置,决定了对实体使用字段访问(持久化引擎直接访问)还是属性访问(通过获取方法与设置方法访问)。
持久化的类。
2. 当一个表的列较多时可以启用动态语句,避免hibernate在省城SQL语句时更新所有列。可以通过以下方式实现:
@org.hibernate.annotations.Entity(dynamicInsert =true, dynamicUpdate = true)
4. hibernate使用衍生属性:该属性没有列属性,不会出现在SQL的INSERT或者UPDATE中
Public BigDecima getTatalIncludingTax(){
}
5.hibernate生成的属性值
@Column(updateable =false,insertable = fasle)
Private Date lastModified;
默认的属性值
需要启用动态的插入与更新
6.hibernate映射组件
需要在被嵌入的类上添加@Embeddable注解
二、 继承与定制类型
(1) 每个带有隐式多态的具体类一张表
Hibernate默认情况下,基类的属性被忽略并且不是持久化的,需要在具体的子类中注解超类来启用属性的嵌入。
@MappedSuperClass
public abstract class BillingDetails{
@Column(name ="OWNER", nullable = flase
private String owner;
....
}
//具体的子类
@Entity
@AttributeOverride(name = "owner", column = @Column(nmae ="CC_OWNER", nullable = flase)
public class CreditCard extends BillingDetails{
@Id
private Long id = null;
....
}
(2) 每个带有联合的具体类一张表
与(一)对应的表结构类似,此时超类的数据库标识符被该层所有的具体类公用,此时需要把主键移到超类中去,同时从子类中移除
@Entity
@Inheritance(stategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BillingDetaisl{
@Id@GeneratedValue
@Column
Private Lang id =null
...
}
//子类中则不需要包含主键
@Entity
@Table(name ="CREDIT_CARD")
public class CreditCard extends BillingDetails{
@Column
private String number;
..
}
(3) 每个类层次结构一张表
这种情况下超类与子类在同一张表中,由特定行表示具体的子类。
这种映射策略比较简单,也是表示多态的最佳方法,但是所有的子类属性必须声明为可以为空。
@Entity
@Inheritance(strategy = InheritaceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "BILLING_DETAILS_TYPE, discirminatorType = DiscriminatorType.STRING)
public abstract class BillingDetails{
@Id@GeneratedValue
@Column
private Long id = null;
...
}
@Entity
@DiscriminatorVlaue("CC)
public class CreditCard extends BillingDetails{
@Column(name = "CC_NUMBER")
private String number;
...
}
(4) 每个子类一张表
这种情况将超类的属性(子类的共享属性)单独映射到一张表,同时每个子类的不同属性,各自的映射一张表。
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class BillingDetails{
@Id@GeneratedValue
@Column(name = "BILLING_DETAILS_ID)
private Long id = null;
...
}
//子类可以指定主键的列明,不指定则直接舒勇超类的主键列作为其外键列
@Entity
@PrimaryKeyJoinColumn(name = "CREDIT_CARD_ID")
public class CreditCard extends BillingDetails{
....
}
(5) 混合继承策略
也就是可以针对特定子类指定单独的继承策略
//父类继承策略中选取了SINGLE_TABLE,但仍然可以使某个子类单独映射表
@Entity
@DiscriminatorValue("CC")
@SecodaryTable(name ="CREDIT_CARD",
pkJoinColumns = @PrimaryKeyJoinColumn(name = "CREDIT_CARD_ID")
)
public class CreditCard extends BillingDetails{
@Column(table = "CREDIT_CARD", name ="CC_NUMBER", nuable = false)
private String number;
...
}