hibernate annotation 双向 one-to-one 注解

「爱情、让人受尽委屈。」 2022-07-21 00:19 224阅读 0赞

环境:

  1. Hibernate 3.3.1
  2. Maven 3.0.4
  3. MySQL 5.5.13
  4. Myeclipse 8.6.1

建表语句:

复制代码

  1. DROP TABLE IF EXISTS `t_card`;
  2. CREATE TABLE `t_card` (
  3. `cardId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  4. `cardNumber` char(18) NOT NULL,
  5. PRIMARY KEY (`cardId`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gb2312;
  7. INSERT INTO `t_card` VALUES ('1', '440911199008011122');

复制代码

复制代码

  1. DROP TABLE IF EXISTS `t_person`;
  2. CREATE TABLE `t_person` (
  3. `personId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  4. `personName` varchar(15) NOT NULL,
  5. `cid` int(10) unsigned NOT NULL,
  6. PRIMARY KEY (`personId`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gb2312;
  8. INSERT INTO `t_person` VALUES ('1', 'fancy', '1');

复制代码

Person.java

复制代码

  1. package com.fancy.po;
  2. import javax.persistence.CascadeType;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.JoinColumn;
  8. import javax.persistence.OneToOne;
  9. import javax.persistence.Table;
  10. /**
  11. * -----------------------------------------
  12. * @文件: Person.java
  13. * @作者: fancy
  14. * @邮箱: fancyzero@yeah.net
  15. * @时间: 2012-6-10
  16. * @描述: 实体类
  17. * -----------------------------------------
  18. */
  19. /**
  20. * @Entity 声明一个类为实体Bean
  21. * @Table(name = "xx")指定实体类映射的表,如果表名和实体类名一致,可以不指定
  22. */
  23. @Entity
  24. @Table(name = "t_person")
  25. public class Person {
  26. private Integer personId;
  27. private String personName;
  28. private Card card;
  29. /**
  30. * @Id 映射主键属性,这里采用uuid的主键生成策略
  31. * @GeneratedValue —— 注解声明了主键的生成策略。该注解有如下属性
  32. * strategy 指定生成的策略,默认是GenerationType. AUTO
  33. * GenerationType.AUTO 主键由程序控制
  34. * GenerationType.TABLE 使用一个特定的数据库表格来保存主键
  35. * GenerationType.IDENTITY 主键由数据库自动生成,主要是自动增长类型
  36. * GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列
  37. * generator 指定生成主键使用的生成器
  38. */
  39. @Id
  40. @GeneratedValue(strategy = GenerationType.AUTO)
  41. public Integer getPersonId() {
  42. return personId;
  43. }
  44. /**
  45. * @OneToOne:一对一关联
  46. * cascade:级联,它可以有有五个值可选,分别是:
  47. * CascadeType.PERSIST:级联新建
  48. * CascadeType.REMOVE : 级联删除
  49. * CascadeType.REFRESH:级联刷新
  50. * CascadeType.MERGE : 级联更新
  51. * CascadeType.ALL : 以上全部四项
  52. * @JoinColumn:主表外键字段
  53. * cid:Person所映射的表中的一个字段
  54. */
  55. @OneToOne(cascade = CascadeType.ALL)
  56. @JoinColumn(name = "cid")
  57. public Card getCard() {
  58. return card;
  59. }
  60. public String getPersonName() {
  61. return personName;
  62. }
  63. public void setPersonId(Integer personId) {
  64. this.personId = personId;
  65. }
  66. public void setPersonName(String personName) {
  67. this.personName = personName;
  68. }
  69. public void setCard(Card card) {
  70. this.card = card;
  71. }
  72. }

复制代码

Card.java

复制代码

  1. package com.fancy.po;
  2. import javax.persistence.Entity;
  3. import javax.persistence.GeneratedValue;
  4. import javax.persistence.GenerationType;
  5. import javax.persistence.Id;
  6. import javax.persistence.OneToOne;
  7. import javax.persistence.Table;
  8. /**
  9. * -----------------------------------------
  10. * @文件: Card.java
  11. * @作者: fancy
  12. * @邮箱: fancyzero@yeah.net
  13. * @时间: 2012-6-10
  14. * @描述: 实体类
  15. * -----------------------------------------
  16. */
  17. @Entity
  18. @Table(name = "t_card")
  19. public class Card {
  20. private Integer cardId;
  21. private String cardNumber;
  22. private Person person;
  23. @Id
  24. @GeneratedValue(strategy = GenerationType.AUTO)
  25. public Integer getCardId() {
  26. return cardId;
  27. }
  28. /**
  29. * @OneToOne:一对一关联
  30. * mappedBy = "card":意思是说这里的一对一配置参考了card
  31. * card又是什么呢?card是Person类中的getCard(),注意不是Person类中的
  32. * card属性,Person类中的OneToOne配置就是在getCard()方法上面配的.
  33. * 如果Person类中的getCard()方法改成getIdCard(),其他不变的话,
  34. * 这里就要写成:mappedBy = "idCard"
  35. */
  36. @OneToOne(mappedBy = "card")
  37. public Person getPerson() {
  38. return person;
  39. }
  40. public String getCardNumber() {
  41. return cardNumber;
  42. }
  43. public void setCardId(Integer cardId) {
  44. this.cardId = cardId;
  45. }
  46. public void setCardNumber(String cardNumber) {
  47. this.cardNumber = cardNumber;
  48. }
  49. public void setPerson(Person person) {
  50. this.person = person;
  51. }
  52. }

复制代码

pom.xml

复制代码

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.fancy</groupId>
  5. <artifactId>hibernate-annotation-on-to-one-example</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>jar</packaging>
  8. <name>hibernate-annotation-on-to-one-example</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. </properties>
  13. <dependencies>
  14. <!-- hibernate jar -->
  15. <dependency>
  16. <groupId>org.hibernate</groupId>
  17. <artifactId>hibernate-entitymanager</artifactId>
  18. <version>3.3.1.ga</version>
  19. </dependency>
  20. <!-- hibernate annotation jar -->
  21. <dependency>
  22. <groupId>org.hibernate</groupId>
  23. <artifactId>hibernate-annotations</artifactId>
  24. <version>3.3.1.GA</version>
  25. </dependency>
  26. <!-- mysql -->
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <version>5.1.17</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>junit</groupId>
  34. <artifactId>junit</artifactId>
  35. <version>3.8.1</version>
  36. <scope>test</scope>
  37. </dependency>
  38. </dependencies>
  39. </project>

复制代码

Test.java

复制代码

  1. package com.fancy.test;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.AnnotationConfiguration;
  5. import org.hibernate.cfg.Configuration;
  6. import com.fancy.po.Card;
  7. import com.fancy.po.Person;
  8. /**
  9. * -----------------------------------------
  10. * @文件: Test.java
  11. * @作者: fancy
  12. * @邮箱: fancyzero@yeah.net
  13. * @时间: 2012-6-10
  14. * @描述: 测试类
  15. * -----------------------------------------
  16. */
  17. public class Test {
  18. public static void main(String[] args) {
  19. //读取hibernate配置,默认读取classpath下的hibernate.cfg.xml
  20. Configuration conf = new AnnotationConfiguration();
  21. //构建session工厂
  22. SessionFactory sessionFactory = conf.configure().buildSessionFactory();
  23. //打开session
  24. Session session = sessionFactory.openSession();
  25. //开始事务
  26. session.beginTransaction();
  27. // * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  28. //test1(session); //测试 1
  29. //test2(session); //测试 2
  30. test3(session); //测试 3
  31. // * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  32. //提交事务
  33. session.getTransaction().commit();
  34. //关闭session工厂
  35. sessionFactory.close();
  36. //关闭session
  37. session.close();
  38. }
  39. /**
  40. * 数据库初始值:
  41. * personName:fancy
  42. * cardNumber:440911199008011122
  43. */
  44. //测试方法1
  45. public static void test1(Session session){
  46. Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
  47. Card card = person.getCard();
  48. System.out.println(person.getPersonName());
  49. System.out.println(card.getCardNumber());
  50. person.setPersonName("fancy"); //与初始值一致
  51. card.setCardNumber("440911199008011122");//与初始值一致
  52. session.save(person); //不发出sql语句
  53. //session.save(card); //不发出sql语句
  54. }
  55. //测试方法2
  56. public static void test2(Session session){
  57. Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
  58. Card card = person.getCard();
  59. System.out.println(person.getPersonName());
  60. System.out.println(card.getCardNumber());
  61. person.setPersonName("fancyzero"); //与初始值不一致
  62. card.setCardNumber("440911199008011122");//与初始值一致
  63. session.save(person); //发出Person的update语句,数据库中personName被修改,不发出Card的update语句
  64. //session.save(card); //发出Person的update语句,数据库中personName被修改,不发出Card的update语句
  65. }
  66. //测试方法3
  67. public static void test3(Session session){
  68. Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
  69. Card card = person.getCard();
  70. System.out.println(person.getPersonName());
  71. System.out.println(card.getCardNumber());
  72. person.setPersonName("fancy"); //与初始值不一致
  73. card.setCardNumber("440911199008080808");//与初始值不一致
  74. session.save(person); //同时发出Person和Card的update语句,数据库中的数据相应被修改
  75. //session.save(card); //同时发出Person和Card的update语句,数据库中的数据相应被修改
  76. }
  77. }

复制代码

转载自:http://www.cnblogs.com/fancyzero/archive/2012/06/10/hibernate-one-to-one-annotation.html

发表评论

表情:
评论列表 (有 0 条评论,224人围观)

还没有评论,来说两句吧...

相关阅读