Hibernate注解版关联关系映射全解析+案例

  1. name:可选,表示表的名称。默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名

  2. catalog:可选,表示Catalog名称。默认为Catalog(”“)

  3. schema:可选,表示Schema名称。默认为Schema(”“)

  4. 3、@id

  5. 必须

  6. @id定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键。置于getXxxx()前

  7. 4、@GeneratedValue(strategy=GenerationType,generator=“”)

  8. 可选

  9. strategy:表示主键生成策略,有AUTO、INDENTITY、SEQUENCE和 TABLE 4种,分别表示让ORM框架自动选择、根据数据库的Identity字段生成、根据数据库表的Sequence字段生成、以及根据一个额外的表生成主键。默认为AUTO

  10. generator:表示主键生成器的名称,这个属性通常和ORM框架相关。例如,Hibernate可以指定uuid等主键生成方式

  11. 示例:

  12. @Id

  13. @GeneratedValues(strategy=StrategyType.SEQUENCE)

  14. public int getPk() {

  15. return pk;

  16. }

  17. 5、@Basic(fetch=FetchType,optional=true)

  18. 可选

  19. @Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法。默认即为@Basic

  20. fetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载。默认为EAGER

  21. optional:表示该属性是否允许为null,默认为true

  22. 示例:

  23. @Basic(optional=false)

  24. public String getAddress() {

  25. return address;

  26. }

  27. 6、@Column

  28. 可选

  29. @Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用

  30. name:表示数据库表中该字段的名称。默认情形属性名称一致

  31. nullable:表示该字段是否允许为null。默认为true

  32. unique:表示该字段是否是唯一标识。默认为false

  33. length:表示该字段的大小,仅对String类型的字段有效

  34. insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中。默认为true

  35. updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段

  36. columnDefinition:表示该字段在数据库中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE、TIME还是TIMESTAMP。此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用

  37. 示例:

  38. @Column(name=“BIRTH”,nullable=“false”,columnDefinition=“DATE”)

  39. public String getBithday() {

  40. return birthday;

  41. }

  42. 7、@Transient

  43. 可选

  44. @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性

  45. 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic

  46. 示例:

  47. //根据birth计算出age属性

  48. @Transient

  49. public int getAge() {

  50. return getYear(new Date()) -getYear(birth);

  51. }

  52. 8、@ManyToOne(fetch=FetchType,cascade=CascadeType)

  53. 可选

  54. @ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键

  55. optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true

  56. fetch:表示抓取策略,默认为FetchType.EAGER

  57. cascade:表示默认的级联操作策略,可以指定为ALL、PERSIST、MERGE、REFRESH和REMOVE中的若干组合,默认为无级联操作

  58. targetEntity:表示该属性关联的实体类型,该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity

  59. 示例:

  60. //订单Order和用户User是一个ManyToOne的关系

  61. //在Order类中定义

  62. @ManyToOne()

  63. @JoinColumn(name=“USER”)

  64. public User getUser() {

  65. return user;

  66. }

  67. 9、@JoinColumn

  68. 可选

  69. @JoinColumn和@Column类似,介量描述的不是一个简单字段,而是一个关联字段,例如,描述一个@ManyToOne的字段.

  70. name:该字段的名称,由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定.

  71. 例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键

  72. 其默认的名称为实体User的名称+下划线+实体User的主键名称

  73. 示例:

  74. 见@ManyToOne

  75. 10、@OneToMany(fetch=FetchType,cascade=CascadeType)

  76. 可选

  77. @OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段

  78. fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存

  79. cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除

  80. 例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除

  81. 示例:

  82. @OneTyMany(cascade=ALL)

  83. public List getOrders() {

  84. return orders;

  85. }

  86. 11、@OneToOne(fetch=FetchType,cascade=CascadeType)

  87. 可选

  88. @OneToOne描述一个一对一的关联

  89. fetch:表示抓取策略,默认为FetchType.LAZY

  90. cascade:表示级联操作策略

  91. 示例:

  92. @OneToOne(fetch=FetchType.LAZY)

  93. public Blog getBlog() {

  94. return blog;

  95. }

  96. 12、@ManyToMany

  97. 可选

  98. @ManyToMany描述一个多对多的关联,多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理

  99. targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class

  100. mappedBy:表示多对多关联的另一个实体类的对应集合属性名称

  101. 13、@MappedSuperclass

  102. 可选

  103. @MappedSuperclass可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解

  104. 示例:

  105. @MappedSuperclass

  106. public class Employee() {

  107. ….

  108. }

  109. @Entity

  110. public class Engineer extends Employee {

  111. ……

  112. }

  113. @Entity

  114. public class Manager extends Employee {

  115. ……

  116. }

  117. 14、@Embedded

  118. 可选

  119. @Embedded将几个字段组合成一个类,并作为整个Entity的一个属性

  120. 例如User包括id、name、city、street、zip属性

  121. 我们希望city、street、zip属性映射为Address对象。这样,User对象将具有id、name和address这三个属性.

  122. Address对象必须定义为@Embededable

  123. 示例:

  124. @Embeddable

  125. public class Address {city,street,zip}

  126. @Entity

  127. public class User {

  128. @Embedded

  129. public Address getAddress() {

  130. ……….

  131. }

  132. }

=================================================================

1、Hibernate注解关系处理关系映射

===================================================================================

[java]  view plain  copy

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用annotation的方式可以更简介,所以这里就简单记录下通过annotation来配置各种映射关系,在hibernate4以后已经将annotation的jar包集成进来了,如果使用hibernate3的版本就需要引入annotation的jar包。

  2. 一、单对象操作

  3. @Entity  —>  如果我们当前这个bean要设置成实体对象,就需要加上Entity这个注解

  4. @Table(name=“t_user”)  —->  设置数据库的表名

  5. public class User

  6. {

  7. private int id;

  8. private String username;

  9. private String password;

  10. private Date born;

  11. private Date registerDate;

  12. @Column(name=“register_date”)  —>  Column中的name属性对应了数据库的该字段名字,里面还有其他属性,例如length,nullable等等

  13. public Date getRegisterDate()

  14. {

  15. return registerDate;

  16. }

  17. public void setRegisterDate(Date registerDate)

  18. {

  19. this.registerDate = registerDate;

  20. }

  21. @Id  —>  定义为数据库的主键ID  (建议不要在属性上引入注解,因为属性是private的,如果引入注解会破坏其封装特性,所以建议在getter方法上加入注解)

  22. @GeneratedValue  —->  ID的生成策略为自动生成

  23. public int getId()

  24. {

  25. return id;

  26. }

  27. public void setId(int id)

  28. {

  29. this.id = id;

  30. }

  31. …………

  32. }

  33. 最后只需要在hibernate.cfg.xml文件里面将该实体类加进去即可:

  34. <!– 基于annotation的配置 –>

  35. <mapping class=“com.xiaoluo.bean.User”/>

  36. <!– 基于hbm.xml配置文件 –>

  37. 这样我们就可以写测试类来进行我们的CRUD操作了。

  38. 二、一对多的映射(one-to-many)

  39. 这里我们定义了两个实体类,一个是ClassRoom,一个是Student,这两者是一对多的关联关系。

  40. ClassRoom类:

  41. @Entity

  42. @Table(name=“t_classroom”)

  43. public class ClassRoom

  44. {

  45. private int id;

  46. private String className;

  47. private Set students;

  48. public ClassRoom()

  49. {

  50. students = new HashSet();

  51. }

  52. public void addStudent(Student student)

  53. {

  54. students.add(student);

  55. }

  56. @Id

  57. @GeneratedValue

  58. public int getId()

  59. {

  60. return id;

  61. }

  62. public void setId(int id)

  63. {

  64. this.id = id;

  65. }

  66. public String getClassName()

  67. {

  68. return className;

  69. }

  70. public void setClassName(String className)

  71. {

  72. this.className = className;

  73. }

  74. @OneToMany(mappedBy=“room”)  —>  OneToMany指定了一对多的关系,mappedBy=“room”指定了由多的那一方来维护关联关系,mappedBy指的是多的一方对1的这一方的依赖的属性,(注意:如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表)

  75. @LazyCollection(LazyCollectionOption.EXTRA)  —>  LazyCollection属性设置成EXTRA指定了当如果查询数据的个数时候,只会发出一条 count(*)的语句,提高性能

  76. public Set getStudents()

  77. {

  78. return students;

  79. }

  80. public void setStudents(Set students)

  81. {

  82. this.students = students;

  83. }

  84. }

  85. Student类:

  86. @Entity

  87. @Table(name=“t_student”)

  88. public class Student

  89. {

  90. private int id;

  91. private String name;

  92. private int age;

  93. private ClassRoom room;

  94. @ManyToOne(fetch=FetchType.LAZY)  —> ManyToOne指定了多对一的关系,fetch=FetchType.LAZY属性表示在多的那一方通过延迟加载的方式加载对象(默认不是延迟加载)

  95. @JoinColumn(name=“rid”)  —>  通过 JoinColumn 的name属性指定了外键的名称 rid (注意:如果我们不通过JoinColum来指定外键的名称,系统会给我们声明一个名称)

  96. public ClassRoom getRoom()

  97. {

  98. return room;

  99. }

  100. public void setRoom(ClassRoom room)

  101. {

  102. this.room = room;

  103. }

  104. @Id

  105. @GeneratedValue

  106. public int getId()

  107. {

  108. return id;

  109. }

  110. public void setId(int id)

  111. {

  112. this.id = id;

  113. }

  114. public String getName()

  115. {

  116. return name;

  117. }

  118. public void setName(String name)

  119. {

  120. this.name = name;

  121. }

  122. public int getAge()

  123. {

  124. return age;

  125. }

  126. public void setAge(int age)

  127. {

  128. this.age = age;

  129. }

  130. }

  131. 三、一对一映射(One-to-One)

  132. 一对一关系这里定义了一个Person对象以及一个IDCard对象

  133. Person类:

  134. @Entity

  135. @Table(name=“t_person”)

  136. public class Person

  137. {

  138. private int id;

  139. private String name;

  140. private IDCard card;

  141. @OneToOne(mappedBy=“person”)  —>  指定了OneToOne的关联关系,mappedBy同样指定由对方来进行维护关联关系

  142. public IDCard getCard()

  143. {

  144. return card;

  145. }

  146. public void setCard(IDCard card)

  147. {

  148. this.card = card;

  149. }

  150. @Id

  151. @GeneratedValue

  152. public int getId()

  153. {

  154. return id;

  155. }

  156. public void setId(int id)

  157. {

  158. this.id = id;

  159. }

  160. public String getName()

  161. {

  162. return name;

  163. }

  164. public void setName(String name)

  165. {

  166. this.name = name;

  167. }

  168. }

  169. IDCard类:

  170. @Entity

  171. @Table(name=“t_id_card”)

  172. public class IDCard

  173. {

  174. private int id;

  175. private String no;

  176. private Person person;

  177. @Id

  178. @GeneratedValue

  179. public int getId()

  180. {

  181. return id;

  182. }

  183. public void setId(int id)

  184. {

  185. this.id = id;

  186. }

  187. public String getNo()

  188. {

  189. return no;

  190. }

  191. public void setNo(String no)

  192. {

  193. this.no = no;

  194. }

  195. @OneToOne  —>  OnetoOne指定了一对一的关联关系,一对一中随便指定一方来维护映射关系,这里选择IDCard来进行维护

  196. @JoinColumn(name=“pid”)  —>  指定外键的名字 pid

  197. public Person getPerson()

  198. {

  199. return person;

  200. }

  201. public void setPerson(Person person)

  202. {

  203. this.person = person;

  204. }

  205. }

  206. 注意:在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系。

  207. 四、Many-to-Many映射(多对多映射关系)

  208. 多对多这里通常有两种处理方式,一种是通过建立一张中间表,然后由任一一个多的一方来维护关联关系,另一种就是将多对多拆分成两个一对多的关联关系

  209. 1.通过中间表由任一一个多的一方来维护关联关系

  210. Teacher类:

  211. @Entity

  212. @Table(name=“t_teacher”)

  213. public class Teacher

  214. {

  215. private int id;

  216. private String name;

  217. private Set courses;

  218. public Teacher()

  219. {

  220. courses = new HashSet();

  221. }

  222. public void addCourse(Course course)

  223. {

  224. courses.add(course);

  225. }

  226. @Id

  227. @GeneratedValue

  228. public int getId()

  229. {

  230. return id;

  231. }

  232. public void setId(int id)

  233. {

  234. this.id = id;

  235. }

  236. public String getName()

  237. {

  238. return name;

  239. }

  240. public void setName(String name)

  241. {

  242. this.name = name;

  243. }

  244. @ManyToMany(mappedBy=“teachers”)  —>  表示由Course那一方来进行维护

  245. public Set getCourses()

  246. {

  247. return courses;

  248. }

  249. public void setCourses(Set courses)

  250. {

  251. this.courses = courses;

  252. }

  253. }

  254. Course类:

  255. @Entity

  256. @Table(name=“t_course”)

  257. public class Course

  258. {

  259. private int id;

  260. private String name;

  261. private Set teachers;

  262. public Course()

  263. {

  264. teachers = new HashSet();

  265. }

  266. public void addTeacher(Teacher teacher)

  267. {

  268. teachers.add(teacher);

  269. }

  270. @ManyToMany   —> ManyToMany指定多对多的关联关系

  271. @JoinTable(name=“t_teacher_course”, joinColumns={ @JoinColumn(name=“cid”)},

  272. inverseJoinColumns={ @JoinColumn(name = “tid”) })  —>  因为多对多之间会通过一张中间表来维护两表直接的关系,所以通过 JoinTable 这个注解来声明,name就是指定了中间表的名字,JoinColumns是一个 @JoinColumn类型的数组,表示的是我这方在对方中的外键名称,我方是Course,所以在对方外键的名称就是 rid,inverseJoinColumns也是一个 @JoinColumn类型的数组,表示的是对方在我这放中的外键名称,对方是Teacher,所以在我方外键的名称就是 tid

  273. public Set getTeachers()

  274. {

  275. return teachers;

  276. }

  277. public void setTeachers(Set teachers)

  278. {

  279. this.teachers = teachers;

  280. }

  281. @Id

  282. @GeneratedValue

  283. public int getId()

  284. {

  285. return id;

  286. }

  287. public void setId(int id)

  288. {

  289. this.id = id;

  290. }

  291. public String getName()

  292. {

  293. return name;

  294. }

  295. public void setName(String name)

  296. {

  297. this.name = name;

  298. }

  299. }

  300. 2.将Many-to-Many拆分成两个One-to-Many的映射(Admin、Role、AdminRole)

  301. Admin类:

  302. @Entity

  303. @Table(name=“t_admin”)

  304. public class Admin

  305. {

  306. private int id;

  307. private String name;

  308. private Set ars;

  309. public Admin()

  310. {

  311. ars = new HashSet();

  312. }

  313. public void add(AdminRole ar)

  314. {

  315. ars.add(ar);

  316. }

  317. @Id

  318. @GeneratedValue

  319. public int getId()

  320. {

  321. return id;

  322. }

  323. public void setId(int id)

  324. {

  325. this.id = id;

  326. }

  327. public String getName()

  328. {

  329. return name;

  330. }

  331. public void setName(String name)

  332. {

  333. this.name = name;

  334. }

  335. @OneToMany(mappedBy=“admin”)  —>  OneToMany关联到了AdminRole这个类,由AdminRole这个类来维护多对一的关系,mappedBy=“admin”

  336. @LazyCollection(LazyCollectionOption.EXTRA)

  337. public Set getArs()

  338. {

  339. return ars;

  340. }

  341. public void setArs(Set ars)

  342. {

  343. this.ars = ars;

  344. }

  345. }

  346. Role类:

  347. @Entity

  348. @Table(name=“t_role”)

  349. public class Role

  350. {

  351. private int id;

  352. private String name;

  353. private Set ars;

  354. public Role()

  355. {

  356. ars = new HashSet();

  357. }

  358. public void add(AdminRole ar)

  359. {

  360. ars.add(ar);

  361. }

  362. @Id

  363. @GeneratedValue

  364. public int getId()

  365. {

  366. return id;

  367. }

  368. public void setId(int id)

  369. {

  370. this.id = id;

  371. }

  372. public String getName()

  373. {

  374. return name;

  375. }

  376. public void setName(String name)

  377. {

  378. this.name = name;

  379. }

  380. @OneToMany(mappedBy=“role”)  —>  OneToMany指定了由AdminRole这个类来维护多对一的关联关系,mappedBy=“role”

  381. @LazyCollection(LazyCollectionOption.EXTRA)

  382. public Set getArs()

  383. {

  384. return ars;

  385. }

  386. public void setArs(Set ars)

  387. {

  388. this.ars = ars;

  389. }

  390. }

  391. AdminRole类:

  392. @Entity

  393. @Table(name=“t_admin_role”)

  394. public class AdminRole

  395. {

  396. private int id;

  397. private String name;

  398. private Admin admin;

  399. private Role role;

  400. @Id

  401. @GeneratedValue

  402. public int getId()

  403. {

  404. return id;

  405. }

  406. public void setId(int id)

  407. {

  408. this.id = id;

  409. }

  410. public String getName()

  411. {

  412. return name;

  413. }

  414. public void setName(String name)

  415. {

  416. this.name = name;

  417. }

  418. @ManyToOne  —>  ManyToOne关联到Admin

  419. @JoinColumn(name=“aid”)

  420. public Admin getAdmin()

  421. {

  422. return admin;

  423. }

  424. public void setAdmin(Admin admin)

  425. {

  426. this.admin = admin;

  427. }

  428. @ManyToOne  —>

  429. @JoinColumn(name=“rid”)

  430. public Role getRole()

  431. {

  432. return role;

  433. }

  434. public void setRole(Role role)

  435. {

  436. this.role = role;

  437. }

  438. }

  439. 小技巧:通过hibernate来进行插入操作的时候,不管是一对多、一对一还是多对多,都只需要记住一点,在哪个实体类声明了外键,就由哪个类来维护关系,在保存数据时,总是先保存的是没有维护关联关系的那一方的数据,后保存维护了关联关系的那一方的数据,如:

  440. Person p = new Person();

  441. p.setName(”xiaoluo”);

  442. session.save§;

  443. IDCard card = new IDCard();

  444. card.setNo(”1111111111”);

  445. card.setPerson§;

  446. session.save(card);

2、Hibernate基于注解的双向one-to-many映射关系的实现

==================================================================================================

项目中用到了一对多的实体类关系映射,之前接触的都是基于配置文件的映射实现,但是公司的大部分都是基于注解的,因此自己参考之前的代码捣鼓了基于注解的一对多的映射关系实现。

背景:

一的一端:QingAoCenterInfo:青奥场所信息,

多的一端:QingAoPlaceInfo:青奥场馆信息,

其中一个青奥场所下可以包含多个青奥场馆

one端:QingAoCenterInfo,持有QingAoPlaceInfo的List引用,

通过注解@OneToMany(mappedBy=”qingAoCenterInfo”,cascade= CascadeType.ALL)

mappedBy:定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义, 否则可能引起数据一致性的问题。要由One的一方指向Many的一方,并且,这个属性应该等于Many的一方中含有One类的属性的属性名,否则会出错啦

cascade:CascadeType[]类型。该属性定义类和类之间的级联关系。

定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。

举个例子:Order 和OrderItem有级联关系,那么删除QingAoCenterInfo时将同时删除它所对应的QingAoPlaceInfo对象。而如果QingAoPlaceInfo还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。

cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。

[java]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. package com.yuqiaotech.nttelcom.model;

  2. import java.util.Date;

  3. import java.util.List;

  4. import javax.persistence.CascadeType;

  5. import javax.persistence.Entity;

  6. import javax.persistence.GeneratedValue;

  7. import javax.persistence.GenerationType;

  8. import javax.persistence.Id;

  9. import javax.persistence.OneToMany;

  10. import javax.persistence.Table;

  11. /**

  12. * 青奥重点场所信息表。

  13. *

  14. */

  15. @Entity(name=“QING_AO_CENTER_INFO”)

  16. @Table(name=“QING_AO_CENTER_INFO”)

  17. public class QingAoCenterInfo {

  18. private Long id;

  19. private String centerName;  //重点场所名称

  20. private Long alarmNum;      //告警数

  21. private String note;        //备注

  22. private String iconName;    //图标名称

  23. private String cityName;    //所在城市

  24. private String type;        //重点场所、活动保障

  25. private Date createTime;

  26. private List qingAoPlaceInfo; //场所拥有的场馆

  27. @Id

  28. @GeneratedValue(strategy=GenerationType.AUTO)

  29. public Long getId() {

  30. return id;

  31. }

  32. public void setId(Long id) {

  33. this.id = id;

  34. }

  35. /**

  36. * @searchItem

  37. * displayType=”text”

  38. *

  39. * 重点场所名称

  40. * @return

  41. */

  42. public String getCenterName() {

  43. return centerName;

  44. }

  45. public void setCenterName(String centerName) {

  46. this.centerName = centerName;

  47. }

  48. /**

  49. * 告警数

  50. * @return

  51. */

  52. public Long getAlarmNum() {

  53. return alarmNum;

  54. }

  55. public void setAlarmNum(Long alarmNum) {

  56. this.alarmNum = alarmNum;

  57. }

  58. /**

  59. * 备注

  60. * @return

  61. */

  62. public String getNote() {

  63. return note;

  64. }

  65. public void setNote(String note) {

  66. this.note = note;

  67. }

  68. /**

  69. * 图标名称

  70. * @return

  71. */

  72. public String getIconName() {

  73. return iconName;

  74. }

  75. public void setIconName(String iconName) {

  76. this.iconName = iconName;

  77. }

  78. public String getCityName() {

  79. return cityName;

  80. }

  81. public void setCityName(String cityName) {

  82. this.cityName = cityName;

  83. }

  84. public String getType() {

  85. return type;

  86. }

  87. public void setType(String type) {

  88. this.type = type;

  89. }

  90. public Date getCreateTime() {

  91. return createTime;

  92. }

  93. public void setCreateTime(Date createTime) {

  94. this.createTime = createTime;

  95. }

  96. @OneToMany(mappedBy=“qingAoCenterInfo”,cascade= CascadeType.ALL)

  97. public List getQingAoPlaceInfo() {

  98. return qingAoPlaceInfo;

  99. }

  100. public void setQingAoPlaceInfo(List qingAoPlaceInfo) {

  101. this.qingAoPlaceInfo = qingAoPlaceInfo;

  102. }

  103. }

many端:QingAoPlaceInfo,持有QingAoCenterInfo的引用

通过@ManyToOne(fetch=FetchType.LAZY )    @JoinColumn(name=”f_center_id”)设置关联关系

@ManyToOne指明QingAoPlaceInfo和QingAoCenterInfo之间为多对一关系,多个QingAoPlaceInfo实例关联的都是同一个QingAoCenterInfo对象

fetch和lazy是用来定义级联查询的方式:

fetch:官方文档里对fetch有如下描述,Hibernate3 定义了如下几种抓取策略:

[java]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. package com.yuqiaotech.nttelcom.model;

  2. import java.util.Date;

  3. import java.util.List;

  4. import javax.persistence.CascadeType;

  5. import javax.persistence.Entity;

  6. import javax.persistence.FetchType;

  7. import javax.persistence.GeneratedValue;

  8. import javax.persistence.GenerationType;

  9. import javax.persistence.Id;

  10. import javax.persistence.JoinColumn;

  11. import javax.persistence.ManyToOne;

  12. import javax.persistence.OneToMany;

  13. import javax.persistence.Table;

  14. /**

  15. * 场馆信息。

  16. *

  17. */

  18. @Entity(name=“QING_AO_PLACE_INFO”)

  19. @Table(name=“QING_AO_PLACE_INFO”)

  20. public class QingAoPlaceInfo {

  21. private Long id;

  22. private QingAoCenterInfo qingAoCenterInfo;// 重点场所id

  23. private String placeName;// 场馆名称

  24. private String note;// 备注

  25. private String openStat;// 开通状态

  26. private Long displayOrder;

  27. private String cityName;

  28. private Date createTime;

  29. private List qingAoPlaceCdmaSector;//拥有的cdma

  30. private List qingAoPlaceLteSector;//拥有的Lte

  31. private List qingAoAp;                          //拥有的Ap

  32. @Id

  33. @GeneratedValue(strategy = GenerationType.AUTO)

  34. public Long getId() {

  35. return id;

  36. }

  37. public void setId(Long id) {

  38. this.id = id;

  39. }

  40. @ManyToOne(fetch=FetchType.LAZY )

  41. @JoinColumn(name=“f_center_id”)

  42. public QingAoCenterInfo getQingAoCenterInfo() {

  43. return qingAoCenterInfo;

  44. }

  45. public void setQingAoCenterInfo(QingAoCenterInfo qingAoCenterInfo) {

  46. this.qingAoCenterInfo = qingAoCenterInfo;

  47. }

  48. /**

  49. * @searchItem

  50. * displayType=”text”

  51. * 场所名称

  52. * @return

  53. */

  54. public String getPlaceName() {

  55. return placeName;

  56. }

  57. public void setPlaceName(String placeName) {

  58. this.placeName = placeName;

  59. }

  60. public String getNote() {

  61. return note;

  62. }

  63. public void setNote(String note) {

  64. this.note = note;

  65. }

  66. public String getOpenStat() {

  67. return openStat;

  68. }

  69. public void setOpenStat(String openStat) {

  70. this.openStat = openStat;

  71. }

  72. public Long getDisplayOrder() {

  73. return displayOrder;

  74. }

  75. public void setDisplayOrder(Long displayOrder) {

  76. this.displayOrder = displayOrder;

  77. }

  78. public String getCityName() {

  79. return cityName;

  80. }

  81. public void setCityName(String cityName) {

  82. this.cityName = cityName;

  83. }

  84. public Date getCreateTime() {

  85. return createTime;

  86. }

  87. public void setCreateTime(Date createTime) {

  88. this.createTime = createTime;

  89. }

  90. @OneToMany(mappedBy=“qingAoPlaceInfo”,cascade= CascadeType.ALL)

  91. public List getQingAoPlaceCdmaSector() {

  92. return qingAoPlaceCdmaSector;

  93. }

  94. public void setQingAoPlaceCdmaSector(

  95. List qingAoPlaceCdmaSector) {

  96. this.qingAoPlaceCdmaSector = qingAoPlaceCdmaSector;

  97. }

  98. @OneToMany(mappedBy=“qingAoPlaceInfo”,cascade= CascadeType.ALL)

  99. public List getQingAoPlaceLteSector() {

  100. return qingAoPlaceLteSector;

  101. }

  102. public void setQingAoPlaceLteSector(

  103. List qingAoPlaceLteSector) {

  104. this.qingAoPlaceLteSector = qingAoPlaceLteSector;

  105. }

  106. @OneToMany(mappedBy=“qingAoPlaceInfo”,cascade= CascadeType.ALL)

  107. public List getQingAoAp() {

  108. return qingAoAp;

  109. }

  110. public void setQingAoAp(List qingAoAp) {

  111. this.qingAoAp = qingAoAp;

  112. }

  113. }

3、Hibernate4 注解版关系案例

=====================================================================================

一对多和多对一


公司用的maven 所以我也是建的maven工程,导入hibernate4的jar包

[html]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. <dependency>

  2. <groupId>org.hibernate</groupId>

  3. <artifactId>hibernate-core</artifactId>

  4. <version>4.1.6.Final</version>

  5. </dependency>

但是oracle的驱动包,好像要自己手动加。不知道有没有用maven直接从网上加的方法。

hibernate.cfg.xml  文件

[html]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. ”-//Hibernate/Hibernate Configuration DTD 3.0//EN”

  2. “http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd”>

  3. <hibernate-configuration>

  4. <session-factory>

  5. <!– 数据库信息 –>

  6. <property name=“dialect”>

  7. org.hibernate.dialect.Oracle10gDialect

  8. </property>

  9. <property name=“connection.url”>jdbc:oracle:thin:@192.168.15.102:1521:ora11g</property>

  10. <property name=“connection.driver_class”>oracle.jdbc.driver.OracleDriver</property>

  11. <property name=“connection.username”>iris_ecnu_dev</property>

  12. <property name=“connection.password”>iris_ecnu_dev</property>

  13. <!– 其他配置 –>

  14. <property name=“show_sql”>true</property>

  15. <property name=“hbm2ddl.auto”>update</property>

  16. <property name=“format_sql”>true</property>

  17. <!– 导入映射配置  –>

  18. <mapping class=“cn.lzg.Order” />

  19. <mapping class=“cn.lzg.Person” />

  20. </session-factory>

  21. </hibernate-configuration>

Order.java 文件

[java]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. package cn.lzg;

  2. import java.util.Date;

  3. import javax.persistence.Column;

  4. import javax.persistence.Entity;

  5. import javax.persistence.FetchType;

  6. import javax.persistence.GeneratedValue;

  7. import javax.persistence.GenerationType;

  8. import javax.persistence.Id;

  9. import javax.persistence.JoinColumn;

  10. import javax.persistence.ManyToOne;

  11. import javax.persistence.SequenceGenerator;

  12. import javax.persistence.Table;

  13. @Entity

  14. @Table(name = “order_lzg”)

  15. public class Order {

  16. @Id

  17. @SequenceGenerator(name = “order_lzg”, sequenceName = “o_seq”, allocationSize = 1)

  18. @GeneratedValue(generator = “order_lzg”, strategy = GenerationType.SEQUENCE)

  19. private Long order_id;

  20. @Column(name = “submit_time”)

  21. private Date submit_time;

  22. @ManyToOne(fetch = FetchType.LAZY)

  23. @JoinColumn(name = “p_id”)

  24. // order_lzg表 里面 放person_lzg ID的列

  25. private Person person_lzg;

  26. public Order() {

  27. }

  28. public Long getOrder_id() {

  29. return order_id;

  30. }

  31. public void setOrder_id(Long order_id) {

  32. this.order_id = order_id;

  33. }

  34. public Date getSubmit_time() {

  35. return submit_time;

  36. }

  37. public void setSubmit_time(Date submit_time) {

  38. this.submit_time = submit_time;

  39. }

  40. public Person getPerson_lzg() {

  41. return person_lzg;

  42. }

  43. public void setPerson_lzg(Person person_lzg) {

  44. this.person_lzg = person_lzg;

  45. }

  46. }

Person.java 文件

[java]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. package cn.lzg;

  2. import java.util.HashSet;

  3. import java.util.Set;

  4. import javax.persistence.CascadeType;

  5. import javax.persistence.Column;

  6. import javax.persistence.Entity;

  7. import javax.persistence.FetchType;

  8. import javax.persistence.GeneratedValue;

  9. import javax.persistence.GenerationType;

  10. import javax.persistence.Id;

  11. import javax.persistence.OneToMany;

  12. import javax.persistence.SequenceGenerator;

  13. import javax.persistence.Table;

  14. @Entity

  15. @Table(name = “person_lzg”)

  16. public class Person {

  17. @Id

  18. @SequenceGenerator(name = “person_lzg”, sequenceName = “p_seq”, allocationSize = 1)

  19. @GeneratedValue(generator = “person_lzg”, strategy = GenerationType.SEQUENCE)

  20. private Long p_id;

  21. @Column(name = “name”)

  22. private String name;

  23. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = “person_lzg”)

  24. // mappedBy的值,是Order对象里面存Person对象的属性的值

  25. private Set orderSet = new HashSet();

  26. public Long getp_id() {

  27. return p_id;

  28. }

  29. public void setp_id(Long p_id) {

  30. this.p_id = p_id;

  31. }

  32. public String getName() {

  33. return name;

  34. }

  35. public void setName(String name) {

  36. this.name = name;

  37. }

  38. public Set getOrderSet() {

  39. return orderSet;

  40. }

  41. public void setOrderSet(Set orderSet) {

  42. this.orderSet = orderSet;

  43. }

  44. }

多对多


其实它的和 一对多 差不多,但是按照网上写法出现了一个问题,使得 双向的关系变成了单向的。

Person类

[java]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. package cn.lzg;

  2. import java.util.ArrayList;

  3. import java.util.List;

  4. import javax.persistence.Column;

  5. import javax.persistence.Entity;

  6. import javax.persistence.FetchType;

  7. import javax.persistence.GeneratedValue;

  8. import javax.persistence.GenerationType;

  9. import javax.persistence.Id;

  10. import javax.persistence.JoinColumn;

  11. import javax.persistence.JoinTable;

  12. import javax.persistence.ManyToMany;

  13. import javax.persistence.SequenceGenerator;

  14. import javax.persistence.Table;

  15. @Entity

  16. @Table(name = “person_lzg”)

  17. public class Person {

  18. @Id

  19. @SequenceGenerator(name = “person_lzg”, sequenceName = “p_seq”, allocationSize = 1)

  20. @GeneratedValue(generator = “person_lzg”, strategy = GenerationType.SEQUENCE)

  21. private Long p_id;

  22. @Column(name = “name”)

  23. private String name;

  24. @ManyToMany(targetEntity = cn.lzg.Book.class, fetch = FetchType.LAZY)

  25. @JoinTable(name = “lzgp_lzgb”, joinColumns = { @JoinColumn(name = “p_id”) }, inverseJoinColumns = { @JoinColumn(name = “b_id”) })

  26. // name中间表的名字,第一个自己的主键,第二个关联的主键

  27. private List books = new ArrayList();

  28. public Long getP_id() {

  29. return p_id;

  30. }

  31. public void setP_id(Long p_id) {

  32. this.p_id = p_id;

  33. }

  34. public String getName() {

  35. return name;

  36. }

  37. public void setName(String name) {

  38. this.name = name;

  39. }

  40. public List getBooks() {

  41. return books;

  42. }

  43. public void setBooks(List books) {

  44. this.books = books;

  45. }

  46. }

Book类

[java]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. package cn.lzg;

  2. import java.util.ArrayList;

  3. import java.util.List;

  4. import javax.persistence.Column;

  5. import javax.persistence.Entity;

  6. import javax.persistence.FetchType;

  7. import javax.persistence.GeneratedValue;

  8. import javax.persistence.GenerationType;

  9. import javax.persistence.Id;

  10. import javax.persistence.JoinColumn;

  11. import javax.persistence.JoinTable;

  12. import javax.persistence.ManyToMany;

  13. import javax.persistence.SequenceGenerator;

  14. import javax.persistence.Table;

  15. @Entity

  16. @Table(name = “book_lzg”)

  17. public class Book {

  18. @Id

  19. @SequenceGenerator(name = “book_lzg”, sequenceName = “b_seq”, allocationSize = 1)

  20. @GeneratedValue(generator = “book_lzg”, strategy = GenerationType.SEQUENCE)

  21. private Long b_id;

  22. @Column(name = “name”)

  23. private String name;

  24. @ManyToMany(targetEntity = cn.lzg.Person.class, fetch = FetchType.LAZY)

  25. // 如果在上面使用mappedBy后,就成单向的了.也就是mappedBy出现的位置所在的类,这个类是被维护端,它只能被别人级联,不能去保存别人.

  26. // 这个问题搞了好久才发现,开始一直是单向的.

  27. @JoinTable(name = “lzgp_lzgb”, joinColumns = { @JoinColumn(name = “b_id”) }, inverseJoinColumns = { @JoinColumn(name = “p_id”) })

  28. private List persons = new ArrayList();

  29. public Long getB_id() {

  30. return b_id;

  31. }

  32. public void setB_id(Long b_id) {

  33. this.b_id = b_id;

  34. }

  35. public String getName() {

  36. return name;

  37. }

  38. public void setName(String name) {

  39. this.name = name;

  40. }

  41. public List getPersons() {

  42. return persons;

  43. }

  44. public void setPersons(List persons) {

  45. this.persons = persons;

  46. }

  47. }

注意

[java]  view plain copy 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 如果在上面ManyToMany注解中使用mappedBy,就成单向的了.因为mappedBy出现的位置所在的类,这个类是被维护端,它只能被别人级联,不能去保存别人

  2. 测试类

  3. <pre name=”code” class=“java”>package cn.lzg;

  4. import java.util.ArrayList;

  5. import java.util.Date;

  6. import java.util.List;

  7. import org.hibernate.Session;

  8. import org.hibernate.SessionFactory;

  9. import org.hibernate.Transaction;

  10. import org.hibernate.cfg.Configuration;

  11. import org.hibernate.service.ServiceRegistry;

  12. import org.hibernate.service.ServiceRegistryBuilder;

  13. import org.junit.Test;

  14. public class TestHibernate {

  15. private static Configuration configuration = null;

  16. private static SessionFactory sessionFactory = null;

  17. private static ServiceRegistry serviceRegistry = null;

  18. private static Session session = null;

  19. static {

  20. /**

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
By后,就成单向的了.也就是mappedBy出现的位置所在的类,这个类是被维护端,它只能被别人级联,不能去保存别人.

  1. // 这个问题搞了好久才发现,开始一直是单向的.

  2. @JoinTable(name = “lzgp_lzgb”, joinColumns = { @JoinColumn(name = “b_id”) }, inverseJoinColumns = { @JoinColumn(name = “p_id”) })

  3. private List persons = new ArrayList();

  4. public Long getB_id() {

  5. return b_id;

  6. }

  7. public void setB_id(Long b_id) {

  8. this.b_id = b_id;

  9. }

  10. public String getName() {

  11. return name;

  12. }

  13. public void setName(String name) {

  14. this.name = name;

  15. }

  16. public List getPersons() {

  17. return persons;

  18. }

  19. public void setPersons(List persons) {

  20. this.persons = persons;

  21. }

  22. }

注意

[java]  view plain copy [外链图片转存中…(img-dgOSqZ3Z-1714793329353)] [外链图片转存中…(img-LGkMbzTl-1714793329354)]

  1. 如果在上面ManyToMany注解中使用mappedBy,就成单向的了.因为mappedBy出现的位置所在的类,这个类是被维护端,它只能被别人级联,不能去保存别人

  2. 测试类

  3. <pre name=”code” class=“java”>package cn.lzg;

  4. import java.util.ArrayList;

  5. import java.util.Date;

  6. import java.util.List;

  7. import org.hibernate.Session;

  8. import org.hibernate.SessionFactory;

  9. import org.hibernate.Transaction;

  10. import org.hibernate.cfg.Configuration;

  11. import org.hibernate.service.ServiceRegistry;

  12. import org.hibernate.service.ServiceRegistryBuilder;

  13. import org.junit.Test;

  14. public class TestHibernate {

  15. private static Configuration configuration = null;

  16. private static SessionFactory sessionFactory = null;

  17. private static ServiceRegistry serviceRegistry = null;

  18. private static Session session = null;

  19. static {

  20. /**

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-mEceqeIi-1714793329354)]

[外链图片转存中…(img-cjJVdeST-1714793329354)]

[外链图片转存中…(img-jGYPcmxC-1714793329354)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值