1:要注意的是:fetch = FetchType.EAGER这句话在一个类里面只能出现一次,出现两次就会报错“cannot simultaneously fetch multiple bags”,要把其他的改为fetch = FetchType.LAZY延迟加载就可以了。听说把List集合改为Set也能解决这个错误。 (这个错一般很难出现,正常用的大部分是用懒加载)
2、@Table(name="X")这句话可以不写,不写就已类名作为表名 ,例如类名是GoodsClass,表明就是goods_class
3、如果想让两个类的属性生成一个数据表,在一个类里这样加入另一个类即可: @Embedded
private C c; 这个样C这个类就直接用普通bean方式写,不需要@Entity,但可以使用@Column等属性,这样子C不会生成新的独立表,而引用C的表会生成C的相应属性
3、如果想要一个类继承另一个类的所有属性,则在父类里这样写:
@SuppressWarnings("serial")
@Entity
@MappedSuperclass //增加这一行
并把父类的所有属性的private改为protected即可 ,这样继承父类后,子类就可以使用父类的字段和属性
4、建议在一对多关联中在"一"方用延迟加载"多"方可以在HQL中显式的"迫切左外连接" left join fetch 这样做Hibernate可以少访问数据库,也可以用"@BatchSize(size = 5)"来减少访问数据库的次数 ,batchSize我是没用过,不知道效果如何
5. @Id 声明属性为主键
6. @GeneratedValue表示主键是自动生成策略,一般该注释和 @Id 一起使用 ,当然如果主键是自动生成,那么在实体中,如果调用setId会报错,这个在实际应用中很伤人。
7. @Entity 任何 hibernte 映射对象都要有次注释 ,标明这是hibernate实体
8. @Table(name = “tablename”) 类声明此对象映射到哪个表
9. @Column(name = “Name”,nullable=false,length=32) 声明数据 库字段和类属性对应关系,name是名字属性,nullable是是否允许为空,length是字段长度
10. @Lob 声明字段为 Clob 或 Blob 类型 ,暂时没用过
11. @OneToMany(mappedBy=”order”,cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@OrderBy(value = “id ASC”)
一对多声明,和 ORM 产品声明类似,一看就明白了。
@ManyToOne(cascade=CascadeType.REFRESH,optional=false)
@JoinColumn(name = “order_id”)
声明为双向关联
11. @Temporal(value=TemporalType.DATE) 做日期类型转换。
12. @OneToOne(optional= true,cascade = CascadeType.ALL, mappedBy = “person”)
一对一关联声明
@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true)
声明为双向关联
13. @ManyToMany(mappedBy= “students”)
多对多关联声明。
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = “Teacher_Student”,
joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName = “teacherid”)},
inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName =
“studentid”)})
多对多关联一般都有个关联表,是这样声明的! 两边的manytomany都需要声明@JoinTable,但是referencedColumnName 这个字段可以避免
14. @Transiten表示此属性与表没有映射关系,是一个暂时的属性 ,这个属性常用,一般是字段之外的处理属性
15. @Cache(usage= CacheConcurrencyStrategy.READ_WRITE)表示此对象应用缓存 ,增加数据的读写速度