Hibernate 注解(Annotation) 的配置

转自:http://www.07net01.com/linux/Hibernate_zhujie_Annotation__depeizhi_50352_1357527742.html

一:映射简单属性:
实例1:

@Entity                                     (@Entity 注解将该类声明为持久类)
@Table(name="FRUITS_PATENT",catalog="",schema="",uniqueConstraints= {@UniqueConstraint(columnNames={"name","pwd"})})
(@Table 为实体Bean指定对应数据库表,目录和schema的名字,uniqueConstraints为表添加约束)
public class Patent implements Serializable 
{
// 主键 唯一标示 id
@Id                             (@Id 注解声明了该实体Bean的标识符(OID))
@GeneratedValue(generator="paymentableGenerator")
(generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid等主键生成方式)
@GenericGenerator(strategy="uuid",name="paymentableGenerator")
(strategy------表示主键生成策略:  
     GenerationType.AUTO   默认值。表示让ORM框架自动选择,对应hibernate中的native;
     GenerationType.TABLE  使用表一保存ID的值;
     GenerationType.IDENTITY  根据数据库的Identity字段生成;
     GenerationType.SEQUENCE  根据数据库表的Sequence字段生成;)
@Column(length=32)
private String id;

//名称
@Column(length=400)
(声明列属性:@Column 
   name="列名", 
   unique=false | true   唯一性,
   nullable= true | false  是否允许为空,
   insertable= true | false  是否允许插入数据,
   updateable=true | false  是否允许修改数据,
   length= 255  字段的长度设置,
   precision= 0   精度,
   scale=0    数值范围  )
private String name;
private String pwd;

//相关产品
@Transient                     (@Transient,忽略属性。该字段将不被持久化)
private List relateProduces;

// 申请日
@Temporal(TemporalType.DATE) 
(日期时间属性:
   TemporalType.DATE   取值如:2012-06-06
   TemporalType.TIME   取值如:22:50:30
   TemporalType.TIMESTAMP 默认选项,取值如:2012-06-06  22:50:30)
private Date appDate;
   
     //说明书摘要
@Lob          
(@Lob 大对象属性,注解属性将被持久化为 Blog 或 Clob 类型:
具体的java.sql.Clob, Character[], char[] 和 java.lang.String 将被持久化为 Clob 类型.               java.sql.Blob, Byte[], byte[] 和 serializable type 将被持久化为 Blob 类型。)
@Basic(fetch=FetchType.LAZY,optional=true) 

(@Basic表示一个简单的属性到数据库表的字段的映射;
   fetch: 表示该属性的读取策略,有EAGER和LAZY两种,分别表示立即加载(即加载数据的时候是一次性加载所有的数据,可能会造成不必要的性能浪费,使用是应该慎重考虑。)和延迟加载(即只有当你真正访问关联关系的时候,才会执行所需要的select语句),默认为EAGER;optional:表示该属性是否允许为null,默认为true)
@Column(name="DtaContent", columnDefinition="CLOB", nullable=true)
private String abs;

}
二:关联映射关系:
(1).  对于单向关联关系来说:关系写哪方,就由哪方来管理;
     而对于双向关联关系来说:一般情况由多方管理,
     Xml:inverse="true"同注解中的
     @OneToMany(@mappedBy="对方") //反向配置,交由对方管理

(2). 单向多对一映射,是把一方的id做为多方的一个外键使用注解                    @JoinColumn(name="外键名")配置在多方;
而单向一对多的映射中,是把一方的id做为多方的一个外键使用注解 @JoinColumn(name="外键名")配置在一方。

1.单向多对一关联映射:(多方有一方的引用,一方没有多方的引用)
订单Order和用户User是一个ManyToOne的关系,实例如下:
@Entity
public class Order{
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  
  @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
  @JoinColumn(name="user_id")                                 (@JoinColumn(name="外键"))
  private User  user;
}
(@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键;
optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true
fetch:表示抓取策略,默认为FetchType.EAGER(即使加载),或者FetchType.LAZY(即延迟加载)
cascade:指定级联操作的行为(可多选),默认为无级联操作:
CascadeType.PERSIST:级联新增
CascadeType.MERGE:级联修改
CascadeType.REMOVE:级联删除
CascadeType.REFRESH:级联刷新
CascadeType.ALL:以上4种方法都适用
targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity.)



@Entity
public class User{
  @Id
  @GeneratedValue
  private Long id;
  private String name;
}

2.单向一对多关联映射(一方有集合属性,包含多个多方,而多方没有一方的引用):
种类Category 和产品Product 是OneToMany的关联关系,实例如下:
@Entity
public class Category {
  @Id
  @GeneratedValue
  private Long id;
  private String name;

  @OneToMany(cascade=CascadeType.ALL)
  @JoinColumn(name="cate_id")                                 (@JoinColumn(name="外键"))
  private List<Product> productList;
}

@Entity
public class Product {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
}

3.双向一对多关联映射(两边都有对方的引用,方便查询):
种类Category 和产品Product 是OneToMany的关联关系,实例如下:
@Entity
public class Category {
  @Id  @GeneratedValue
  private Long id;
  private String name;

  @OneToMany(cascade=CascadeType.ALL,mappedBy="cate")
  private List<Product> productList;
}
(@OneToMany 设置一对多关联。
cascade属性指定关联级别,cascade属性有五个值,分别是
CascadeType.PERSIST(级联新建),
CascadeType.REMOVE(级联删除),
CascadeType.REFRESH(级联刷新),
CascadeType.MERGE(级联更新),
CascadeType.ALL(全部四项);
fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载。
(mappedBy="多段的属性":用在双向关联中,把关系的维护权反转)  )
@Entity
public class Product {
  @Id  @GeneratedValue
  private Long id;
  private String name;

  @ManyToOne(cascade=
     {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
  @JoinColumn(name="cate_id")
  private Category cate;
}
双向一对多关联映射配置方法:
"一端"配置:
@OneToMany(cascade=CascadeType.ALL,mappedBy="“多端”的属性")
Public List<“多端”类> get“多端”列表()  { return “多端”列表 }
“多端”配置:
  方法一:
@ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="外键")
public 主表类 get主表类()   { return 主表对象 }
  方法二:
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name="关联表名",
joinColumns = @JoinColumn(name="主表外键"),
     inverseJoinColumns = @JoinColumns(name="从表外键")  )

4.一对一基于外键关联:
用户 User(主表)和省份证号 IdCard (从表)是一对一的关联关系,实例如下:
@Entity
public class User{
  @Id
  @GeneratedValue
  private Long id;
  private String loginName;

  @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
  @JoinColumn(name="card_id")
  private IdCard  idCard;
}
(@OneToOne 设置一对一的关联关系。
cascade属性指定关联级别,
fetch:指定数据的加载策略,
      (@JoinColumn(name="外键"))   )

@Entity
public class IdCard {
  @Id
  @GeneratedValue
  private Long id;
  private String idCardNo; 
  @OneToOne(mappedBy="idCard")  
                   (mappedBy="主表类中的从表属性":用在双向关联中,把关系的维护权反转)
  private User user; 
}

一对一基于外键的关联配置方法:
方法一:
  主表配置:
@OneToOne(cascade = CascadeType.ALL,fetch=FetchType.LAZY/EAGER)
@JoinColumn(name="主表外键")  //这里指定的是数据库中的外键字段名。 
public 从表类 get从表类()  {return 从表类 }
  从表配置:
@OneToOne(mappedBy ="主表类中的从表属性") 
//例主表User中有一个从表属性是IdCard  类型的idCard  ,这里就填idCard  
public 主表类 get主表类() { return 主表对象 }
注意:@JoinColumn是可选的。
      默认值是从表变量名+"_"+从表的主键(注意,这里加的是主键。而不是主键对应的变量)。   

方法二:
  主表配置:
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY/EAGER)
@JoinTable( name="关联表名",
            joinColumns = @JoinColumn(name="主表外键"),
            inverseJoinColumns = @JoinColumns(name="从表外键")  )
  从表配置:
     @OneToOne(mappedBy ="主表类中的从表属性")
//例主表User中有一个从表属性是IdCard  类型的idCard  ,这里就填idCard public 主表类 get主表类(){return 主表对象}

5.单向多对多关联映射:
学生Student和课程Course是多对多的关联关系,实例如下:
@Entity
public class Student{
  @Id @GeneratedValue
  private Long id;
  private String name;
  private String grade;

  @ManyToMany(cascade=CascadeType.PERSIST)
  @JoinTable(name="student_course",
       joinColumns={@JoinColumn(name="student_id")},
       inverseJoinColumns={@JoinColumn(name="course_id")})
  private Set<Course> courses;
}

@Entity
public class Course {
  @Id @GeneratedValue
  private Long id;
  private String name; 
}
6.双向多对多关联映射:
  学生Student和课程Course是多对多的关联关系,实例如下:
@Entity
public class Student{
  @Id 
  @GeneratedValue
  private Long id;
  private String name;
  private String grade;

  @ManyToMany(cascade=CascadeType.PERSIST)
  @JoinTable(name="student_course",
       joinColumns={@JoinColumn(name="student_id")},
       inverseJoinColumns={@JoinColumn(name="course_id")})
  private Set<Course> courses;
}

@Entity
public class Course {
  @Id
  @GeneratedValue
  private Long id;
  private String name; 

  @ManyToMany(mappedBy="courses") 
  private Set<Student> students;
}

7.多对多拆成两个一对多(1-->*<--1) 关联映射:
学生Student和课程Course是多对多的关联关系,由于多对多关系不能保存两个实体之间共有的属性,所以用一个中间实体类来记录两个多对多实体之间共有的关系;可以用一个StudentCourse实体来表示两者多对多中的众多关系中的一个关系。即Student与StudentCourse,Course与StudentCourse之间的关系都为一对多的关系。

@Entity
public class Student{
  @Id 
  @GeneratedValue
  private Long id;
  private String name;
  private String grade;

  @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},mappedBy="stu")
  @JoinColumn(name="student_id")
  private List<StudentCourse> scs;
}
@OneToMany(cascade=CascadeType.ALL,mappedBy="“多端”的属性名称")
@JoinColumn(name="外键")
Public List<“多端”类> get“多端”列表()  { return “多端”列表 }

@Entity
public class Course{
  @Id
  @GeneratedValue
  private Long id;
  private String name;

  @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},mappedBy="cou")
  @JoinColumn(name="course_id")
  private List<StudentCourse> scs;
}

@Entity
public class StudentCourse {
  @Id
  @GeneratedValue
  private Long id;

  @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
  @JoinColumn(name="student_id",nullable=false)
  private Student  stu;

  @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
  @JoinColumn(name="course_id", nullable=false)
  private Course  cou;
  private Double score;

}
@ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="外键")
public 主表类 get主表类()   { return 主表对象 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值