JPA使用指南 javax.persistence的注解配置讲解 您所在的位置:网站首页 @id注解 JPA使用指南 javax.persistence的注解配置讲解

JPA使用指南 javax.persistence的注解配置讲解

2024-07-16 04:07| 来源: 网络整理| 查看: 265

转自http://67566894.iteye.com/blog/659829

示例

@SuppressWarnings("serial") @Entity @Table(name="T_X") public class X implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(length=32) private String name; @Transient //表示此数据不在数据库表里建立属性 private String temp; @Temporal(TemporalType.TIMESTAMP) //这个是带时分秒的类型 private Date date; @OneToOne(cascade = CascadeType.ALL, mappedBy = "x") private A a; } @SuppressWarnings("serial") @Entity @Table(name="T_A") public class A implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @OneToMany(cascade = CascadeType.ALL, mappedBy = "a", fetch = FetchType.EAGER) private List b = new ArrayList(); @OneToOne() @JoinColumn(name = "x_Id") //加这句后就会双方共同维护关系 private X x; } @SuppressWarnings("serial") @Entity public class B implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.AUTO) protected int id; @ManyToOne() @JoinColumn(name = "a_id") protected A a; }

要注意的是:fetch = FetchType.EAGER这句话在一个类里面只能出现一次,出现两次就会报错“cannot simultaneously fetch multiple bags”,要把其他的改为fetch = FetchType.LAZY延迟加载就可以了。听说把List集合改为Set也能解决这个错误。 

其他要点: 1、@Table(name="T_X")这句话可以不写,不写就已类名作为表名 

2、如果想让两个类的属性生成一个数据表,在一个类里这样加入另一个类即可: @Embedded private C c; 

3、如果想要一个类继承另一个类的所有属性,则在父类里这样写: @SuppressWarnings("serial") @Entity @MappedSuperclass   //增加这一行 并把父类的所有属性的private改为protected即可 

4、建议在一对多关联中在"一"方用延迟加载"多"方可以在HQL中显式的"迫切左外连接" left join fetch 这样做Hibernate可以少访问数据库,也可以用"@BatchSize(size = 5)"来减少访问数据库的次数 

 

1. @Id 声明属性为主键 

2. @GeneratedValue表示主键是自动生成策略,一般该注释和 @Id 一起使用 

3. @Entity 任何 hibernte 映射对象都要有次注释 

4. @Table(name = “tablename”) 类声明此对象映射到哪个表 

5. @Column(name = “Name”,nullable=false,length=32) 声明数据 库字段和类属性对应关系 

6. @Lob 声明字段为 Clob 或 Blob 类型 

7. @OneToMany(mappedBy=”order”,cascade = CascadeType.ALL, fetch = FetchType.LAZY)    @OrderBy(value = “id ASC”)    一对多声明,和 ORM 产品声明类似,一看就明白了。    @ManyToOne(cascade=CascadeType.REFRESH,optional=false)    @JoinColumn(name = “order_id”)    声明为双向关联 

8. @Temporal(value=TemporalType.DATE) 做日期类型转换。 

9. @OneToOne(optional= true,cascade = CascadeType.ALL, mappedBy = “person”)    一对一关联声明    @OneToOne(optional = false, cascade = CascadeType.REFRESH)    @JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true)    声明为双向关联 

10. @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”)})    多对多关联一般都有个关联表,是这样声明的! 

11. @Transiten表示此属性与表没有映射关系,是一个暂时的属性 

12. @Cache(usage= CacheConcurrencyStrategy.READ_WRITE)表示此对象应用缓存 

JPA规范 @Entity:通过@Entity注解将一个类声明为一个实体bean 

@Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名) 

@Id:用于标记属性的主键 

@Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前,例如: 

@Column(name = "EMPLOYEE_NAME") 

private String employee_name; 或者 

@Column(name = "EMPLOYEE_NAME") 

public String getEmployee_name() { 

return employee_name; 

} 这两种方式都是正解的,根据个人喜好来选择。大象偏向于第二种,并且喜欢将属性名与字段名设成一样的,这样可以省掉@Column注解,使代码更简洁。 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有