`

hibernate-annotations

阅读更多

CascadeType.PERSIST (级联新建) 

CascadeType.REMOVE (级联删除) 

CascadeType.REFRESH (级联刷新) 

CascadeType.MERGE (级联更新)中选择一个或多个。 

CascadeType.ALL

 

有时候CascadeType不行,

解决方法:利用hibernate的自定义的级联删除,不要使用jpa的 

import org.hibernate.annotations.Cascade; 

import org.hibernate.annotations.CascadeType; 

.....................// 

@OneToMany(mappedBy="enterprise") 

@Cascade(value={CascadeType.SAVE_UPDATE}) 

................................//

Class Level:


1:通过@Entity声明当前pojo为实体Bean
2:通过@Table定义对应数据库表的属性
   name:表名,默认实体类名
   uniqueConstraints:定义表的唯一性约束

@Entity

@Table( name = "tb_user",

      uniqueConstraints ={@UniqueConstraint(columnNames = "userName")})

public class User implements Serializable {

    private Integer id;

    private String userName;

}

 

 

 

主键

 

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

或者

@Id   

    @GeneratedValue(generator = "system-uuid")   

    @GenericGenerator(name = "system-uuid", strategy = "uuid")   

 

 

 

 

Method Level

 

@Basic

@Transient

@Column

 

所有非static非transient都会被持久化,也就是说所有加@Transient是不会被保存到数据库中的,所有没有加注的默认为@Basic,通过Column我们可以更一步的定义列名,是否为空,长度,是否可更新等等属性值,

这里设置的name,比如actcodeId,那么数据库中就是actcode_id

 @Column(name = "actcodeId", updatable = false, nullable = true, length = 36)   

 

 

 

@Column(name = "userName", nullable = false, length = 80, unique = true)

    public String getUserName() {

        return userName;

    }

    public void setUserName(String userName) {

        this.userName = userName;

    }

    @Transient

    public String getPassword() {

        return password;

   }

 

默认的列名就是属性名,上面的name="userName"只是演示而已。

password加注为@Transient,所以通过SchemaExport导入Schema,查看表结构是没有这个字段的。

 

 

@Formula

 

 

@Formula(" (select COUNT(*) from school_info) ")  

    private int count;

 

 

 

@Temporal

日期类型,分三种,Time,Date,Timestamp

@Temporal(TemporalType.TIMESTAMP)

    public Date getBirthday() {

        return birthday;

   }

 

 

@Lob

1:所有的Clob,Character,char,String都会被转为Clob

2:所有的Blob,Byte[],byte[],serializable都会被转为Blob

 

POJO中有一个private String content;的属性,按ejb3配成@Lob后,被处理成了text类型,text 64k的存储容量还是比较可怜了。

  @Lob

  @Column(columnDefinition = "LongText")

 

@Lob

    public Clob getResume() {

        return resume;

    }

 

    @Lob

    public Blob getImage() {

        return image;

}

 

 

级联策略


在ejb3-persistence.jar中只定义了ALL、MERGE、PERSIST、REFRESH、REMOVE,比较恶心的就是,删除对象的时候,并不会级联删除关联对象,而是用update xx set parent_id=null where parent_id=?这类语句把关系干掉了事。不得已,在这儿用了hibernate的DELETE_ORPHAN。
@OneToMany(targetEntity = Attachment.class)

  @Cascade(value = {org.hibernate.annotations.CascadeType.DELETE_ORPHAN,

      org.hibernate.annotations.CascadeType.ALL})

  @JoinColumn(name = "info_id")

 

 

CACHE

 

 

ejb3-persistence.jar里面没有找到cache的配置,继续请出hibernate来干活

 

import org.hibernate.annotations.Cache;

import org.hibernate.annotations.CacheConcurrencyStrategy;

 

@Entity

@Table(name = "T_INFO")

@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

 

 

实例

 

 

@Entity

Public class Troop{

@OneToMany(mappedBy = "troop")

Public Set<Solder> getSolders(){}

}

 

@Entity

Public class Solder{

@ManyToOne

@JoinColumn(name="troop_fk")

Public Troop getTroop(){}

}

 

Troop通过troop属性和Solder建立了一对多关的双向关联,在mappedBy端不必也不能再定义任何物理映射。对以一对多的双向关联,如果要一对多这一端维护关联关系,需要删除mappedBy元素并将多对以这一段的@JoinColumn的inserttable和updatetable设置为false。

 

// mappedBy="school"就相当于inverse=true,(mappedBy指定的是不需要维护关系的一端)   

 // 应该注意的是mappedBy值对应@ManyToOne标注的属性,我刚开始写成"schoolId",让我郁闷了好一会 

 

    @OneToMany(mappedBy = "school", cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = UserMember.class)   

    // 用范性的话,就不用targetEntity了   

    private List<usermember> users = </usermember>new ArrayList<usermember>();  </usermember> 

 

 

 

 

import javax.persistence.CascadeType;   

import javax.persistence.Column;   

import javax.persistence.Entity;   

import javax.persistence.FetchType;   

import javax.persistence.GeneratedValue;   

import javax.persistence.Id;   

import javax.persistence.OneToMany;   

import javax.persistence.Table;   

import javax.persistence.Temporal;   

import javax.persistence.TemporalType;   

   

import org.hibernate.annotations.Formula;   

import org.hibernate.annotations.GenericGenerator;   

   

@Entity   

@Table(name = "school_info")   

public class SchoolInfo implements java.io.Serializable {   

   

    @Id   

    @GeneratedValue(generator = "system-uuid")   

    @GenericGenerator(name = "system-uuid", strategy = "uuid")   

    private String id;//hibernate的uuid机制,生成32为字符串   

   

    @Column(name = "actcodeId", updatable = false, nullable = true, length = 36)   

    private String actcodeId;   

   

    @Formula("select COUNT(*) from school_info")   

    private int count;   

   

    @Temporal(TemporalType.TIMESTAMP)//不用set,hibernate会自动把当前时间写入   

    @Column(updatable = false, length = 20)   

    private Date createTime;   

   

    @Temporal(TemporalType.TIMESTAMP)   

    private Date updateTime;// 刚开始我默认insertable=false,但会读取出错提示如下:   

    // Value '0000-00-00' can not be represented as java.sql.Timestamp   

   

    // mappedBy="school"就相当于inverse=true,(mappedBy指定的是不需要维护关系的一端)   

    // 应该注意的是mappedBy值对应@ManyToOne标注的属性,我刚开始写成"schoolId",让我郁闷了好一会 

 

    @OneToMany(mappedBy = "school", cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = UserMember.class)   

    // 用范性的话,就不用targetEntity了   

    private List<usermember> users = </usermember>new ArrayList<usermember>();  </usermember> 

       

}   

@GeneratedValue(strategy=GenerationType.AUTO)我们常用的自增长机制,我这里采用的是hibernate的uuid生成机制.

需要注意的是import javax.xx.Entity ,而不是org.hibernate.xx.Entity。

郁闷的是我上面用到@Formula,生成的sql竟然是'select COUNT(*) from school_info as formula0_ from school_info schoolinfo0_,当然不能执行了,寻求正解中~!!!!!!!!!

 

UserMember.java(前面引入的包已经贴过了,下面就不贴了)  

@Entity   

@Table(name = "teacher_info")//实体类和数据库表名不一致时,才用这个   

public class UserMember implements java.io.Serializable {   

   

    @Id   

    @GeneratedValue(generator = "system-uuid")   

    @GenericGenerator(name = "system-uuid", strategy = "uuid")   

    private String id;   

   

    @Column(updatable = false, nullable = false, length = 20)   

    private String logonName;   

       

    @Temporal(TemporalType.TIMESTAMP)   

    @Column(updatable = false, length = 20)   

    private Date createTime;   

   

    @Temporal(TemporalType.TIMESTAMP)   

    private Date updateTime;   

   

    @ManyToOne(cascade = { CascadeType.MERGE })   

    @JoinColumn(name = "schoolId")   

    private SchoolInfo school;   

    //注意该类就不用声明schoolId属性了,如果不用@JoinColumn指明关联的字段,hibernate默认会是school_id.   

   

}   

分享到:
评论

相关推荐

    Hibernate-annotations-3.4最新版本

    《深入理解Hibernate-annotations-3.4.0:简化对象持久化的注解神器》 在现代软件开发中,数据库操作是不可或缺的一部分。为了有效地管理数据对象与数据库之间的映射关系,Hibernate作为一款强大的Java对象关系映射...

    hibernate-annotations-3.4.0 中文帮助文档

    hibernate-annotations-3.4.0 中文帮助文档,希望对大家有帮助。

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar ...

    hibernate-annotations-3.4.0.jar

    《Hibernate核心组件:hibernate-annotations-3.4.0.jar详解》 在Java世界里,ORM(Object-Relational Mapping)框架是连接数据库的重要工具,其中Hibernate作为一款广泛应用的ORM框架,大大简化了数据库操作。而`...

    hibernate-annotations-3.4.0.GA.chm中文版

    `html.CHM`可能包含了通用的HTML格式的文档,方便在各种设备上阅读,而`hibernate-annotations-3.4.0.GA.CHM`则可能是专门为Hibernate注解3.4.0.GA版本定制的帮助文件,其中包含了详细的API参考、示例代码和使用指南...

    hibernate-annotations-3.4.0.GA

    《Hibernate Annotations 3.4.0.GA:深入理解与应用》 Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。而Hibernate ...

    hibernate-annotations jar包

    使用注解Annotation时用的jar包。 包括: hibernate-commons-annotations-3.3.0.ga.jar hibernate-entitymanager.jar ejb3-persistence.jar hibernate-annotations.jar

    hibernate-annotations-3.4.0.GA.rar 提供hibernate配置包

    hibernate-annotations-3.4.0.GA.rar 提供hibernate与annotation的配置包,一般现在的版本是3.5的版本,而3.5版本里面的参考文档不是很齐全,因此老版本的hibernate包还是有用的

    hibernate-annotations 相关jar包

    1. 引入Hibernate和Hibernate Annotations相关jar包:包括hibernate-annotations.jar、hibernate-commons-annotations.jar、hibernate-entitymanager.jar以及JPA规范所需的jar包。 2. 创建实体类:在实体类上添加@...

    jquery+json+structs+spring+hibernate-annotations+maven

    标题中的"jquery+json+structs+spring+hibernate-annotations+maven"是一个典型的Java Web开发技术栈,涵盖了前端到后端的核心组件。这里,我们逐一解析这些技术及其关联的知识点。 1. **jQuery**: jQuery是一个...

    hibernate-commons-annotations-5.0.1.Final.jar

    在本文中,我们将深入探讨`hibernate-commons-annotations-5.0.1.Final.jar`的源码,了解其内部结构和主要功能。 一、元数据注解 HCA的核心在于提供了一系列的注解,如`@Entity`、`@Table`、`@Column`、`@Id`等,...

    开发hibernate-annotations-3.4必须的包

    在开发过程中,使用Hibernate-Annotations-3.4版本,有一些必要的包是不可或缺的。这些包提供了核心功能,包括对象关系映射(ORM)、事务管理、查询服务等。 1. **Hibernate Core**: 这是Hibernate的核心库,包含了...

    hibernate-commons-annotations-4.0.1.Final.jar

    hibernate-commons-annotations-4.0.1.Final.jar

    hibernate-annotations-3.4.0.GA and hibernate-entitymanager-3.4.0.GA

    本篇将详细探讨`hibernate-annotations-3.4.0.GA`和`hibernate-entitymanager-3.4.0.GA`这两个版本中的核心知识点,尤其是它们在注释和枚举映射方面的应用。 首先,`hibernate-annotations`是Hibernate提供的一套...

    hibernate-commons-annotations-5.1.0.Final.jar

    hibernate-commons-annotations-5.1.0.Final.jar

    hibernate-common-annotations.jar

    《hibernate-common-annotations.jar:Hibernate ORM框架中的核心注解库详解》 在Java世界里,ORM(Object-Relational Mapping)框架是连接数据库与应用程序的重要桥梁,而Hibernate作为其中的佼佼者,深受广大...

    hibernate-annotations.jar

    《Hibernate Annotations 框架详解》 在Java领域,Hibernate是一个广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作。而`hibernate-annotations.jar`是Hibernate框架中的一个重要组件,主要负责处理...

    hibernate-annotations-3.4.0.GA架包和slf4j-1.5.8架包

    Hibernate Annotations是Hibernate的一部分,它引入了JPA(Java Persistence API)规范,使得在实体类上直接使用注解就能进行数据库操作。3.4.0.GA版本是Hibernate Annotations的一个稳定版本,提供了丰富的功能和...

    hibernate-annotations.jar 3.4.0GA下载

    hibernate annotations 核心包,欢迎下载

Global site tag (gtag.js) - Google Analytics