双向-外键关联

Posted 友情天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双向-外键关联相关的知识,希望对你有一定的参考价值。

一.首先建立工程

二.导入hibernate核心包和mysql-connection包,代码如下:

 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/maven-v4_0_0.xsd">
 3   <modelVersion>4.0.0</modelVersion>
 4   <groupId>com.yztc</groupId>
 5   <artifactId>annotation3</artifactId>
 6   <packaging>war</packaging>
 7   <version>1.0-SNAPSHOT</version>
 8   <name>annotation3 Maven Webapp</name>
 9   <url>http://maven.apache.org</url>
10   <dependencies>
11     <dependency>
12       <groupId>junit</groupId>
13       <artifactId>junit</artifactId>
14       <version>4.12</version>
15       <scope>test</scope>
16     </dependency>
17     <dependency>
18       <groupId>org.hibernate</groupId>
19       <artifactId>hibernate-core</artifactId>
20       <version>5.2.11.Final</version>
21     </dependency>
22     <dependency>
23       <groupId>mysql</groupId>
24       <artifactId>mysql-connector-java</artifactId>
25       <version>5.1.42</version>
26     </dependency>
27   </dependencies>
28   <build>
29     <finalName>annotation3</finalName>
30   </build>
31 </project>

三.配置hibernate.cfg.xml文档,代码如下:

 1 <?xml version=\'1.0\' encoding=\'UTF-8\'?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD//EN"
 4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6     <session-factory>
 7         <!--数据库连接url配置-->
 8         <property name="connection.url">jdbc:mysql:///hibernate2?useUnicode=true&amp;characterEncoding=UTF-8</property>
 9         <!--数据库驱动配置-->
10         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
11         <!--数据库用户名配置-->
12         <property name="connection.username">root</property>
13         <!--数据库密码配置-->
14         <property name="connection.password">ROOT</property>
15         <!-- 方言属性:这个是实现跨数据库关键类 具体查询api-->
16         <property name="dialect">org.hibernate.dialect.MySQL55Dialect</property>
17         <!-- 是否显示sql -->
18         <property name="show_sql">true</property>
19         <!--是否格式化SQL语句-->
20         <property name="format_sql">true</property>
21         <!--是否自动生成表:可选用create update  create-drop validate-->
22         <property name="hbm2ddl.auto">create</property>
23         <mapping class="com.yztc.app.entity.Address"/>
24         <mapping class="com.yztc.app.entity.User"/>
25     </session-factory>
26 </hibernate-configuration>

四.创建entity实体类:User.class和Address.class类,并使用注解,详细代码如下:

 1 package com.yztc.app.entity;
 2 
 3 import org.hibernate.annotations.GenericGenerator;
 4 
 5 import javax.persistence.*;
 6 import java.math.BigDecimal;
 7 
 8 /**
 9  * 一对一
10  *  单向  主键关联    单向外键关联
11  *  双向  外键关联
12  *
13  */
14 
15 @Entity
16 @Table(name = "TB_USERR")
17 public class User {
18     @Id
19     @Column(name = "USER_ID",length = 32)
20     @GeneratedValue(generator = "uuuid_generator")//generator 主键生成器
21     @GenericGenerator(name ="uuuid_generator",strategy = "uuid")//strategy 注解生成器
22     private String userId;
23     @Column(name = "NAME",length = 64)
24     private String name;
25     @Column(name = "PRICE",precision = 8,scale = 2)
26     private BigDecimal price;
27     @Transient
28     private int state;
29     @OneToOne(cascade = CascadeType.ALL)
30     @PrimaryKeyJoinColumn
31     private Address address;
32 
33     public int getState() {
34         return state;
35     }
36 
37     public void setState(int state) {
38         this.state = state;
39     }
40 
41 
42     public BigDecimal getPrice() {
43         return price;
44     }
45 
46     public void setPrice(BigDecimal price) {
47         this.price = price;
48     }
49 
50     public Address getAddress() {
51         return address;
52     }
53 
54     public void setAddress(Address address) {
55         this.address = address;
56     }
57 
58     public String getUserId() {
59         return userId;
60     }
61 
62     public void setUserId(String userId) {
63         this.userId = userId;
64     }
65 
66     public String getName() {
67         return name;
68     }
69 
70     public void setName(String name) {
71         this.name = name;
72     }
73 
74     public User() {
75     }
76 }
 1 package com.yztc.app.entity;
 2 
 3 import org.hibernate.annotations.GenericGenerator;
 4 import javax.persistence.*;
 5 
 6 @Entity
 7 @Table(name = "TB_ADDRESS")
 8 public class Address {
 9     @Id
10     @Column(name = "ADD_ID",length = 32)
11     @GeneratedValue(generator = "uuid")
12     @GenericGenerator(name = "uuid" ,strategy = "uuid")
13     private String addId;
14     @Column()
15     private String name;
16     @OneToOne(cascade = CascadeType.ALL)
17     @JoinColumn(name = "USER_ID")//表示 外键的名称
18     private User user;
19 
20     public User getUser() {
21         return user;
22     }
23 
24     public void setUser(User user) {
25         this.user = user;
26     }
27 
28     public String getAddId() {
29         return addId;
30     }
31 
32     public void setAddId(String addId) {
33         this.addId = addId;
34     }
35 
36     public String getName() {
37         return name;
38     }
39 
40     public void setName(String name) {
41         this.name = name;
42     }
43 }

五.测试类,进行测试,代码如下:

 1 package com.yztc.test;
 2 
 3 import com.yztc.app.entity.Address;
 4 import com.yztc.app.entity.User;
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.cfg.Configuration;
 9 import org.junit.After;
10 import org.junit.Before;
11 import org.junit.Test;
12 
13 public class TestOneToOne {
14 
15     private SessionFactory sf;
16     private Session session;
17 
18     @Before
19     public void init(){
20         sf = new Configuration().configure().buildSessionFactory();
21         session = sf.openSession();
22 
23     }
24     @Test
25     public void testSave(){
26         Transaction transaction = session.beginTransaction();
27 
28         User user = new User();
29         user.setName("用户1");
30         Address address = new Address();
31         address.setName("深圳");
32         address.setUser(user);
33        user.setAddress(address);
34        session.save(user);
35         transaction.commit();
36 
37 
38     }
39     @After
40     public void destory(){
41         session.close();
42     }
43 }

六.测试结果:

"C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\bin\\java" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:E:\\Program Files\\JetBrains\\IntelliJ IDEA 2017.2.1\\lib\\idea_rt.jar=56973:E:\\Program Files\\JetBrains\\IntelliJ IDEA 2017.2.1\\bin" -Dfile.encoding=UTF-8 -classpath "E:\\Program Files\\JetBrains\\IntelliJ IDEA 2017.2.1\\lib\\idea_rt.jar;E:\\Program Files\\JetBrains\\IntelliJ IDEA 2017.2.1\\plugins\\junit\\lib\\junit-rt.jar;E:\\Program Files\\JetBrains\\IntelliJ IDEA 2017.2.1\\plugins\\junit\\lib\\junit5-rt.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\charsets.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\deploy.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\access-bridge-32.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\cldrdata.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\dnsns.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\jaccess.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\jfxrt.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\localedata.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\nashorn.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\sunec.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\sunjce_provider.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\sunmscapi.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\sunpkcs11.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\ext\\zipfs.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\javaws.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\jce.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\jfr.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\jfxswt.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\jsse.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\management-agent.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\plugin.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\resources.jar;C:\\Program Files (x86)\\Java\\jdk1.8.0_131\\jre\\lib\\rt.jar;E:\\WorkSpaces\\IdeaProject\\Annotation3\\target\\test-classes;E:\\WorkSpaces\\IdeaProject\\Annotation3\\target\\classes;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\junit\\junit\\4.12\\junit-4.12.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\org\\hamcrest\\hamcrest-core\\1.3\\hamcrest-core-1.3.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\org\\hibernate\\hibernate-core\\5.2.11.Final\\hibernate-core-5.2.11.Final.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\org\\jboss\\logging\\jboss-logging\\3.3.0.Final\\jboss-logging-3.3.0.Final.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\org\\hibernate\\javax\\persistence\\hibernate-jpa-2.1-api\\1.0.0.Final\\hibernate-jpa-2.1-api-1.0.0.Final.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\org\\javassist\\javassist\\3.20.0-GA\\javassist-3.20.0-GA.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\antlr\\antlr\\2.7.7\\antlr-2.7.7.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\org\\jboss\\spec\\javax\\transaction\\jboss-transaction-api_1.2_spec\\1.0.1.Final\\jboss-transaction-api_1.2_spec-1.0.1.Final.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\org\\jboss\\jandex\\2.0.3.Final\\jandex-2.0.3.Final.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\com\\fasterxml\\classmate\\1.3.0\\classmate-1.3.0.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\dom4j\\dom4j\\1.6.1\\dom4j-1.6.1.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\org\\hibernate\\common\\hibernate-commons-annotations\\5.0.1.Final\\hibernate-commons-annotations-5.0.1.Final.jar;D:\\tools\\maven\\apache-maven-3.5.0\\repository\\mysql\\mysql-connector-java\\5.1.42\\mysql-connector-java-5.1.42.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.yztc.test.TestOneToOne
十月 13, 2017 7:28:09 下午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.11.Final}
十月 13, 2017 7:28:09 下午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
十月 13, 2017 7:28:10 下午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
十月 13, 2017 7:28:10 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
十月 13, 2017 7:28:10 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql:///hibernate2?useUnicode=true&characterEncoding=UTF-8]
十月 13, 2017 7:28:10 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=root, password=****}
十月 13, 2017 7:28:10 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
十月 13, 2017 7:28:10 下午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
十月 13, 2017 7:28:10 下午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL55Dialect
十月 13, 2017 7:28:10 下午 org.hibernate.id.UUIDHexGenerator <init>
WARN: HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values; consider using org.hibernate.id.UUIDGenerator instead
十月 13, 2017 7:28:11 下午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@1b2d00b] for (non-JTA) DDL execution was not in auto-commit mode; the Connection \'local transaction\' will be committed and the Connection will be set into auto-commit mode.
Hibernate:

alter table TB_ADDRESS
drop
foreign key FK7stsktyes1d808a36kv9wlq0s
Hibernate:

drop table if exists TB_ADDRESS
Hibernate:

drop table if exists TB_USERR
Hibernate:

create table TB_ADDRESS (
ADD_ID varchar(32) not null,
name varchar(255),
USER_ID varchar(32),
primary key (ADD_ID)
) engine=InnoDB
十月 13, 2017 7:28:11 下午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@15a0c16] for (non-JTA) DDL execution was not in auto-commit mode; the Connection \'local transaction\' will be committed and the Connection will be set into auto-commit mode.
Hibernate:

create table TB_USERR (
USER_ID varchar(32) not null,
NAME varchar(64),
PRICE decimal(8,2),
primary key (USER_ID)
) engine=InnoDB
Hibernate:

alter table TB_ADDRESS
add constraint FK7stsktyes1d808a36kv9wlq0s
foreign key (USER_ID)
references TB_USERR (USER_ID)
十月 13, 2017 7:28:11 下午 org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSources
INFO: HHH000476: Executing import script \'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@16f8274\'
Hibernate:
insert
into
TB_USERR
(NAME, PRICE, USER_ID)
values
(?, ?, ?)
Hibernate:
insert
into
TB_ADDRESS
(name, USER_ID, ADD_ID)
values
(?, ?, ?)

Process finished with exit code 0

七.表结构:

 

 

以上是关于双向-外键关联的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 之 关联映射的基于外键的双向一对一关联

java之hibernate之基于外键的双向一对一关联映射

hibernate关联映射

Hibernate一对一外键双向关联(Annotation配置)

hibernate基础08:关联映射之基于外键的双向一对一

Hibernate学习———— hibernate一对一关系映射详解