转自:http://blog.sina.com.cn/s/blog_4e17efaf0100eryx.html
任务分两天完成:(一人对多本书)
第一天:
hbm:这种配置方法是以前用到的配置方法,比较熟悉。
问题---mysql的序列生成的各种方法还待明天查
Annotation:第一次用到注释去写hibernate的映射,做了一下午
由于jar包不齐,弄了很久
--->核心jar包:ejb3-persistence.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate.cfg.xml:
加载映射时不是加载映射文件而是映射到实体类
<mapping class="com.yeepay.entity.Person"/>
工具类得到SessionFactory:
seesionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
标签:1).写在类定义上
@Entity //表明是实体类
@Table(name="person_db") //映射到的表名
2).主键修饰
@Id @GeneratedValue(strategy = GenerationType.AUTO)-----表中 auto_increment
@Column(name = "id") // 数据库id
表示是主键,并且对应增长形势,对应表列
1) IDENTITY:表自增键字段,Oracle不支持这种方式;
2) AUTO: JPA自动选择合适的策略,是默认选项; ===auto_increment
3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植
3).普通属性
@Column(name = "name") // 名字
直接在某一属性上写,表示此属性对应表的列
4).关系属性
@OneToMany(cascade = CascadeType.ALL, mappedBy = "person", fetch = FetchType.EAGER)
mappedBy="school"就相当于inverse=true,(mappedBy指定的是不需要维护关系的一端)
关系属性上,表示是OneToMany
cascade级联关系 mappedBy对应类中的自己的应用属性名 fetch懒加载(eager lazy)
@ManyToOne (optional=true, fetch = FetchType.EAGER)
@JoinColumn(name="person_id", nullable=true, insertable = false, updatable = false)
关系属性上,表示是ManyToOne
name表示对应表内字段
注:必须是所谓的双向关系,不然报 没有序列化异常
第二天:
1.mysql的序列生成
auto_increment 自动增长
uuid()函数 适用于并发,但是效率不高,且占磁盘。(UUID的内容是字符串的)
2.@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid") -----表中id没有主键生成
3.特殊@Formula("select COUNT(*) from school_info")
private int count;