码农小汪-Hibernate学习6-hibernate中Annocation修饰属性

对于现在使用注解的方式更流行起来,感觉使用这个挺不错的学习这些属性还是有帮助,我们理解很多东西。

我们可以先创建数据库之后再进行,利用MyEclipse进行反向操作,产生javaBean实体,可以是注解的,可以是xml的。自己喜欢,但是自己还是要看的懂
前面的文章讲解过了注解到底是怎么回事

  • 不想再JavaBean中不想持久的保存属性
    @Transient adj.短暂的;转瞬即逝的;临时的;这个很正常但是还是一般情况下用的比较少,稍微了解就行了
@Entity
@Table(name="news_inf")
public class News {
    // 消息类的标识属性
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    // 消息标题
    // @Column指定该属性映射的列信息,此处指定了列名、长度
    @Column(name="news_title" , length=50)
    private String title;
    // 消息内容 不保存这个属性
    @Transient
    private String content;

    // id的setter和getter方法
    public void setId(Integer id)
    {
        this.id = id;
    }
    public Integer getId()
    {
        return this.id;
    }

    // title的setter和getter方法
    public void setTitle(String title)
    {
        this.title = title;
    }
    public String getTitle()
    {
        return this.title;
    }

    // content的setter和getter方法
    public void setContent(String content)
    {
        this.content = content;
    }
    public String getContent()
    {
        return this.content;
    }
}
  • @Enumerated 列举,枚举
    我们保存的属性不是普通的java类型,而是个枚举,可以使用这个去修饰实体的属性
    除此之外我们的保存到数据库实体的时候,可能有两种情况,保存的是标号,或者为真正的字符串。我们定义枚举这个注解的时候,有个value的值,有两个属性 EnumType.String EnumType,ORDINAL 数字
    如下:
public enum Season
{
    春季,夏季,秋季,冬季
}
@Enumerated(EnumType.ORDINAL) 保存在数据库实体的时候就是个数字
@Column(name="season")
private Season happenSeason;
  • 保存图片我们怎么处理呢?方式!
    一种是将图片转化成二进制数据流存入数据库中。
    一种是保存图片的路径,然后前台读取路径去调用图片。
    第二种方法实现上比较简单,就是存储路径,然后根据路径读取对应的图片显示出来。
    第一种就比较麻烦,要先把图片转化成二进制数据,读取时就是从数据库读取对应数据再转化成图片显示出来。
    使用@Lob @ Basic修饰大型的数据的属性
    数据库的底层从通常使用Blob和Clob类型的数据列来保存数据,Hibernate也为了这种大型数据的值提供了支持,使用@Lob修饰这种大数据,当持久化数据为Byte[]类型的,底层为BLob
    当持久化数据为Char[]或者他的包装类时候,底层采用Clob列进行修饰
    对于使用这种大数据类型,数据库的花销比较的大,我们可以让属性延迟加载,等到真的需要使用这个属性的时候,我们在采取加载,在实体中增加@Basic:
    有两个属性,Fecth:指定是否延迟加载 FetchType.EAGER FetchType.LAYZE
    option:是否允许数据 为空

下面演示个@Lob保存图片的例子

@Lob
@Basic(fetch=FetchType.LAZY)
@Column(nullable=true)
private byte[] pic;

保存数据流对象啊!是不是很简单!
Person person = new Person();
person.setName("JetWang");
File file = new File("logo.jpg");
byte[] content = new byte[(int)file.length()];
new FileInputStream(file).read(content);
person.setPic(content);
// 保存Person对象
sess.save(person);
  • 使用@Temporal adj.时间的;世俗的;暂存的;<语>表示时间的;
    对于java数据而言,时间类型就两种,Date,Calendar。但是对于数据库而言,表示时间的类型很多 date time datetime timestamp这样的背景下,我们如何映射就成了个问题啦。所有这个属性给了个value属性,到底映射为什么样子的属性呢?TemporalType.DATE….

  • 映射属性集合
    集合属性很常见,比如我们的考试成绩就是个map,每个科目对应一个成绩。
    不管使用哪种集合都统一使用@ElemntCollection 元素集合!翻译到位涩
    有属性,一个是Fetch.抓取策略,一个是targetClass。指定集合中元素的类型。可以不指定的,Hibernate会帮我们寻找。
    对于集合的属性,总需要保持到一个数据表中,所以保存数据表必须包含一个外键的列,用于参看主键的列.
    外键的列使用@JoinColumn 加入行,差不多外键的感觉,进行映射
    Hibernate使用标准的@CollecttionTable注解保存集合属性的表,好像啊,对不对。
    这里面有属性:name表示数据表的名称,JoinCloumns表示外键的可能是联合主键嘛。其他的用的少

Java的集合中,有序集合和无序集合

Set无序集合,没得索引的
List,Map有序的集合,需要索引值得,所以需要映射索引列的

  • @OrderColumn 是用来我们的list集合和数组
  • @MapkeyColumn 用于映射我们的Map索引,如果需要知道我们的Key的类型,可以使用@MapKeyClass
    @Id 
    @Column(name="perosn_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    // 标识属性
    private Integer id;
    private String name;
    private int age;
    // 集合属性,保留该对象关联的学校
    @ElementCollection(targetClass=String.class)
    // 映射保存集合属性的表
    @CollectionTable(name="school_inf", // 指定表名为school_inf
        joinColumns=@JoinColumn(name="person_id" , nullable=false))//指明该表的外键到底是目前这个表的哪个,也可以使用不一样的名字,加一个referencedColumnName属性,指定依赖当前的哪个一个列名
    // 指定保存集合元素的列为 school_name,list中值保存的值
    @Column(name="school_name")
    // 映射集合元素索引的列
    @OrderColumn(name="list_order")
    private List<String> schools
        = new ArrayList<>();


这个集合表中就会有三个属性
person_id  list_order school_name 
集合的索引不能重复,所以前面两个都是主键来着。
乐观和悲观的外键。我记得我问过数据库的老师,外键的乐观和悲观之说,我们认为他们是外键就行了,也没必要直接的写成外键

其他的数组,set都差不多,我就跟着书上贴个代码吧

    @Id @Column(name="person_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    // 标识属性
    private Integer id;
    private String name;
    private int age;
    // 集合属性,保留该对象关联的学校
    @ElementCollection(targetClass=String.class)
    // 映射保存集合属性的表
    @CollectionTable(name="school_inf", // 指定表名为school_inf
        joinColumns=@JoinColumn(name="person_id" , nullable=false))
    // 指定保存集合元素的列为 school_name
    @Column(name="school_name")
    // 映射集合元素索引的列
    @OrderColumn(name="array_order")
    private String[] schools;

Map比较特殊一点

    @ElementCollection(targetClass=Float.class)
    // 映射保存集合属性的表
    @CollectionTable(name="score_inf", // 指定表名为score_inf
        joinColumns=@JoinColumn(name="person_id" , nullable=false))
    @MapKeyColumn(name="subject_name")
    // 指定Map key的类型为String类型
    @MapKeyClass(String.class)
    // 映射保存Map value的数据列
    @Column(name="mark")
    private Map<String , Float> scores
        = new HashMap<>();

你可能感兴趣的:(Hibernate)