Jpa->javax.persistence的注解配置

2 篇文章 0 订阅
代码如下:
  1. @SuppressWarnings("serial")  
  2. @Entity  
  3. @Table(name="X")  
  4. public class X implements Serializable  
  5. {  
  6.     @Id  
  7.     @GeneratedValue(strategy = GenerationType.AUTO)  
  8.     private int id;  
  9.   
  10.     @Column(length=32)  
  11.     private String name;  
  12.       
  13.     @Transient   //表示此数据不在数据库表里建立属性  
  14.     private String temp;  
  15.   
  16.     @Temporal(TemporalType.TIMESTAMP) //这个是带时分秒的类型  
  17.     private Date date;  
  18.   
  19.     @OneToOne(cascade = CascadeType.ALL, mappedBy = "x")   //一对一关系,X表维护关系,通过A表里面的x属性,找到A  
  20.     private A a;  //mappedBy的x里有外键,为关系维护方,负责更新外键
  21. }  
  1. @SuppressWarnings("serial")  
  2. @Entity  
  3. @Table(name="A")  
  4. public class A implements Serializable  
  5. {  
  6.     @Id  
  7.     @GeneratedValue(strategy = GenerationType.AUTO)  
  8.     private int id;  
  9.   
  10.     @OneToMany(cascade = CascadeType.ALL, mappedBy = "a", fetch = FetchType.EAGER)  //通过B表里面的a属性,找到B
  11.     private List<B> b = new ArrayList<B>(); //急加载,现取现用,mappedBy的a里有外键,为关系维护方,负责更新外键
  12.   
  13.     @OneToOne()  
  14.     @JoinColumn(name = "x_Id")  //A表里面的x_Id为外键
  15.     private X x;  
  16. }  
  1. @SuppressWarnings("serial")  
  2. @Entity  
  3. public class B implements Serializable{  
  4.     @Id  
  5.     @GeneratedValue(strategy = GenerationType.AUTO)  //主键策略,自增
  6.     protected int id;  
  7.   
  8.     @ManyToOne()  
  9.     @JoinColumn(name = "a_id")  
  10.     protected A a;  
  11. }  

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)表示此对象应用缓存 ,增加数据的读写速度



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值