hibernate实体类注解
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate实体类注解内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate实体类注解相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate实体类注解相关知识
-
hibernate基本注解(全)对hibernate的注解都是一知半解的,这次系统记录注解,便于查找 类级别注解 @Entity映射实体类 @Entity(name="tableName") name:可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略 注意:使用@Entity时必须指定实体类的主键属性 @Table @Table(name="",catalog="",schema="") @Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息。 name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名。 catalog 可选,
-
Hibernate常用标签整理(1)Hibernate的注解分为 类级别注解、属性级别注解、关系映射级别注解。 Hibernate类级别注解主要介绍@Entity、@Table、@Embeddable三个。类级别注解只能标记在实体定义的地方,即public class 类名 上方。 @Entity 注解表明这个class是一个实体类,用于映射实体类,一般情况下类名与表名一致,如果不相同使用name属性对应数据库中映射的表名。Entity必须指定实体类的主键属性,使用@Id标记是主键的变量。 @Table 表示实体对应的数据库表的信息,和@Entity配合使用@Table标签有三个属性,
-
Intellij IDEA 如何通过数据库表生成带注解的实体类图文详细教程Intellij IDEA 如何通过数据库表生成带注解的实体类图文详细教程Intellij IDEA 如何通过数据库表生成带注解的实体类 第一步:新建一个Maven项目。项目的名称为JpaDemo。我这里是通过idea插件对应的spring项目生成器https://start.spring.io,直接生成项目。如图:下一步,修改成对应项目的基本信息。如图:选择相应的依赖jar包。选择项目的位置完成创建温馨提示,之前需要安装好maven。 第二步:配置数据库连接。选择Mysql。配置数据库基本信息其实配置了这个数据库连接之后,是可以直接通过脚本进行导出数据库实体类了,但是这个导出的实体类比较简陋,需要进行修改比较多,或是需要自己进行修改生成脚本语句。如:通过generate POJOs.clj即可导出实体类。需要选一下实体类放置的地方。效果如下:但是以上的实体类没有带注解。那么我们通过项目中用到hibernate,或是jpa需要加注解怎么办,总不能一个个注解加上去吧。idea当然不会这么干啦。使用
-
Hibernate 映射枚举(Enum) 类型的属性在数据库中我们一般用整数或字符串来表示枚举值(有些数据库(如 MySQL)本身带有枚举类型), 而在使用 Hibernate 时实体对象中也用 Integer 或 String 来表示枚举就不那么友好了。试想来我们这样定义实体对象的两个属性@Entitypublic class User { .... public Integer type; //0: Individual 类型,1: Company 类型 public String gender; //可取值 Male 和 Female}这样的定义很不严谨,type 和 gender 理论上可取任何值,这会造成表中数据的混乱。其实 Hibernate 在 Java 实体对象中是可以直接用枚举类型与数据库中的整数或字符串映射,需用到 @Enumerated 注解
hibernate实体类注解相关课程
hibernate实体类注解相关教程
- 3. Hibernate 中使用注解 Hibernate 中,通过元数据的方式描述映射关系,其表达语法有 2 种:其一: XML 语法;其二: 本节课程要给大家隆重推荐的是注解语法。注解语法本质就是 Java 语法。
- 4. @ApiModel 注解与 @ApiModelProperty 注解组合实战 实操目标: 以用户实体类为例,实现对用户业务实体 (Entity) 的准确描述,以及对实体中各个字段的准确描述,体会 @ApiModel 注解与 @ApiModelProperty 注解作用效果的不同之处。实现思路:第一步:使用 @ApiModel 注解对实体类进行描述。第二步:使用 @ApiModelProperty 注解对实体类中的所有字段参数进行描述。第三步:查看配置结果,体会两个注解作用效果的不同之处。实现代码:实体类:@ApiModel(value = "用户实体,存储用户相关字段")public class User { // do something...}代码解释:第 1 行,我们在用户实体类的上方使用 @ApiModel 注解的 value 属性对实体类进行描述:用户实体,存储用户相关字段。实体类中的字段:@ApiModelProperty(name = "id", value = "用户Id", required = true)private Integer id;@ApiModelProperty(name = "username", value = "用户名", required = true)private String username;@ApiModelProperty(name = "idCard", value = "用户身份证号", required = true)private String idCard;@ApiModelProperty(name = "phone", value = "用户手机号码", required = true)private String phone;代码解释:第 1、3、5、7 行,我们使用 @ApiModelProperty 注解的 name 属性、value 属性、required 属性分别定义了字段的名称,内容以及是否必传。显示结果:可以看到,在用蓝色框框起来的位置就是我们使用 @ApiModel 对用户实体类所描述的信息,红色框框起来的位置就是使用 @ApiModelProperty 注解对用户实体类中所有的字段所描述的信息。值得注意的是,在描述字段时,allowEmptyValue 这个属性我们并没有显式的拿来使用,但是 Swagger 还是给我都显示出来了,这是因为 Swagger 默认会将所有字段的 allowEmptyValue 属性置位 false ,表示字段的值可以为空。Tips : 一定要注意上述两个注解所作用的效果,@ApiModel 是直接作用在实体类上的,@ApiModelProperty 是直接作用在实体类中所有参数上的,两者不要搞混。
- 3. 没有中间表实体类的映射 如果中间表仅仅只是充当桥梁作用,没有程序需要的实质性数据时,程序中可以没有中间表对应的实体类。学生和课程的关系,直接在学生类和课程类中体现彼此关系就可以:新建课程实体类:@Entitypublic class Course { private Integer courseId; private String courseName; private String courseDesc; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getCourseId() { return courseId; } //省略其它代码}因为一名学生对应多门课程,在学生实体类中添加集合属性:private Set<Course> courses;完成程序级别上的关系描述后,还需告诉 Hibernate,实体类中的集合属性数据来自哪一张以及如何获取?为了把问题简单化,在学生实体类中只体现和课程的关系 ,前面映射内容注释或删除。学生实体类的完整描述:private Set<Course> courses;@ManyToMany(targetEntity = Course.class)@JoinTable(name = "score", joinColumns = @JoinColumn(name = "stuId", referencedColumnName = "stuId"), inverseJoinColumns = @JoinColumn(name = "courseId", referencedColumnName = "courseId"))public Set<Course> getCourses() { return courses;}@ManyToMany 告诉 Hibernate, course 集合中的数据来自课程表 ;@JoinTable 告诉 Hibernate 获取课程表中数据时需要借助 score 中间表。分别描述中间表和学生表、课程表的连接字段。在 Hibernate 主配置文件中修改或添加如下信息:<property name="hbm2ddl.auto">create</property><mapping class="com.mk.po.Student" /><mapping class="com.mk.po.Course" />执行下面的测试实例:@Testpublic void testGetStuAndCourse() { HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>();}查看 MySql 中的表:切记把下面的信息修改回来:<property name="hbm2ddl.auto">update</property>手工添加测试数据:好!通过测试实例见证 Hibernate 的神奇。HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>();hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { Student stu=(Student)session.get(Student.class, new Integer(1)); System.out.println("---------------------------"); System.out.println("学生姓名:"+stu.getStuName()); System.out.println("----------------------------"); System.out.println("学生选修课程数:"+stu.getCourses().size()); return stu;}});查看控制台上面的输出结果:Hibernate: select student0_.stuId as stuId1_1_0_, student0_.stuName as stuName2_1_0_, student0_.stuPassword as stuPassw3_1_0_, student0_.stuPic as stuPic4_1_0_, student0_.stuSex as stuSex5_1_0_ from Student student0_ where student0_.stuId=?---------------------------学生姓名:Hibernate----------------------------Hibernate: select courses0_.stuId as stuId1_1_1_, courses0_.courseId as courseId2_2_1_, course1_.courseId as courseId1_0_0_, course1_.courseDesc as courseDe2_0_0_, course1_.courseName as courseNa3_0_0_ from score courses0_ inner join Course course1_ on courses0_.courseId=course1_.courseId where courses0_.stuId=?学生选修课程数:2Hibernate 构建了两条 SQL 语句,先是查询到学生信息,需要课程信息时,再通过中间表连接到课程表,查询出课程相关信息。可得出结论:默认情况下,Hibernate 使用了延迟加载。如此做,Hibernate 是考虑了性能的。
- 3.2 使用注解重构代码 现在使用注解方式重构前面代码,使用之前先秀出 Hiernate 中常用的几个注解:@Table:描述实体类对应的表名;@Idclass:指定充当主键的类;@Entity: 标注类是实体类;@Id: 描述哪个属性对应表中的主键字段;@Column:指定与属性对应的字段名;@Basic:等价于没有定义注解的属性;@Transient :属性不被持久化。不要指望一下记住它们,还是通过使用的过程逐步理解为上策。友情提示:心急吃不了热豆腐!!修改学生类@Entity public class Student { private Integer stuId; private String stuName; private String stuSex; public Student(Integer stuId, String stuName, String stuSex) { super(); this.stuId = stuId; this.stuName = stuName; this.stuSex = stuSex; } public Student(String stuName, String stuSex) { super(); this.stuName = stuName; this.stuSex = stuSex; } public Student() { super(); } @Id public Integer getStuId() { return stuId; } public void setStuId(Integer stuId) { this.stuId = stuId; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getStuSex() { return stuSex; } public void setStuSex(String stuSex) { this.stuSex = stuSex; } } 这样可以吗?是的,可以啦。用放大镜扫描一下上面的学生类,好不容易看到 2 个注解:@Entity:标注这个类是持久化类;@Id:标注这个属性是标识属性,必须给出。不要怀疑,对于 Hibernate 来说已经足够,需要知道的常识是:对于其它没有标注任何注解的属性,Hibernate 默认为数据库的表中有与属性同名的字段。替换主配置文件<mapping resource="com/mk/po/Student.hbm.xml" />替换成:<mapping class="com.mk.po.Student" />运行测试实例// 配置对象Configuration configuration = new Configuration().configure();// 服务注册ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings(configuration.getProperties()) .buildServiceRegistry();// 会话工厂SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); // 会话对象Session session = sessionFactory.openSession();// 事务对象Transaction transaction = null;try { // 打开事务 transaction = session.beginTransaction(); // 添加一条学生信息 Student student = new Student(2, "Configuration02", "男"); session.save(student); transaction.commit();} catch (Exception e) { transaction.rollback();} finally { session.close();} } 测试代码还是原来的测试代码!只是新增了一条数据!进入 MySQL 瞧一瞧,数据如假包换的插入成功。是不是感觉如春风般温暖!对 Hibernater 的感受又增加了很多。简直让人无法相信,2 个注解就映射成功。但是,这是有前提条件的:应用程序中的类名和关系数据库中的表名同名时,使用一个@Entity 注解足够;类名和表名不一样时,则需使用 @Table(表名)注解告诉 Hibernate;应用程序中类中的属性名和数据库表中的字段名同名时,Hibernate自会心领意会。实质是没有提供注解的属性默认使用了@Basic 注解。如果属性名与字段名不同名时,请使用 @Column ( name=“stuName”) 注解明确告诉 Hibernate。如果类中某一个属性本就没有对应字段名,仅仅是方便程序中某些需求,这时需要在此属性上加上 @Transient,让 Hibernate 对此属性视之不理。
- 2. 什么是 ApiModel 注解和 ApiModelProperty 注解 ? ApiModel 注解是作用在接口相关实体类上的注解,用来对该接口相关实体类添加额外的描述信息,常常和 @ApiModelProperty 注解配合使用。ApiModelProperty 注解是作用在接口相关实体类的参数上的注解,用来对具体的接口相关实体类中的参数添加额外的描述信息,常常和 @ApiModel 注解关联使用,有时也会单独拿出来用。ApiModel 和 ApiModelProperty 两个注解的作用域不同,但是都提供了丰富的属性来允许我们对接口相关实体类和其中的参数添加额外的描述信息。下面我们来看一下 ApiModel 和 ApiModelProperty 两个注解中都包括哪些主要属性。
- 3.3 注解的位置 注解说:我可不是随便的代码!每一个注解都有自己位置。如同 @Entity、@Table 是类级别注解,对类做整体说明;如同 @Id、@Column、@Transient 这几个注解是属性、方法级别的,可对属性或方法做说明,如下: @Id private Integer stuId; @Column private String stuName;或 @Id public Integer getStuId() { return stuId; } @Column public String getStuName() { return stuName; }如上 2 种方式都可告诉 Hibernate 如何映射表中的对应字段。既然有 2 种方案,必然会有优劣之分(有比较就会有差别的哲学)。提问时间:建议使用哪一种方式?-------------------启动自问自答模式----------------------建议把注解放在属性对应的 get 方法上。为什么?----------------------让你思考0.5秒钟------------------时间到!公布答案。不管是放在属性上面还是放在 get 方法上面,Hibernate 都要使用反射机制,如果直接反射属性,则是对 OOP 封装特性的挑战。虽然使用反射可以在底层为所欲为,但作为有良知的开发者来讲,则要从规范上杜绝破坏 OOP 规则的事情。当然这只是建议!最后的选择由你决定。
hibernate实体类注解相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle