次讲@OneToOne的用法。而且是基于主外键的关联。因为这个是实际开发中最最常见的。
这里先说明一下,我的java类的命名都以Test开头。而对应的对象名却没有用test开头。这里是为了更好的说明注视中的value到底是类名还是对象名。
先看java代码:
TestUser
package net.paoding.forum.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class TestUser
{
String id;
String username;
TestCard card;
/**
* @return the id
*/
@Id
public String getId()
{
return id;
}
/**
* @param id the id to set
*/
public void setId(String id)
{
this.id = id;
}
/**
* @return the username
*/
public String getUsername()
{
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username)
{
this.username = username;
}
/**
* @return the card
*/
@OneToOne
public TestCard getCard()
{
return card;
}
/**
* @param card the card to set
*/
public void setCard(TestCard card)
{
this.card = card;
}
}
TestCard:
package net.paoding.forum.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class TestCard
{
String id;
String cardNumber;
/**
* @return the id
*/
@Id
public String getId()
{
return id;
}
/**
* @param id the id to set
*/
public void setId(String id)
{
this.id = id;
}
/**
* @return the cardNumber
*/
public String getCardNumber()
{
return cardNumber;
}
/**
* @param cardNumber the cardNumber to set
*/
public void setCardNumber(String cardNumber)
{
this.cardNumber = cardNumber;
}
}
这样子就是OneToOne了。这个是单向的关系,即:由TestCard控制TestUser。看sql语句就知道了。
hibernate自动生成的sql为:
drop table test_card cascade constraints;
drop table test_user cascade constraints;
create table test_card (
id varchar2(255 char) not null,
card_number varchar2(255 char),
primary key (id)
);
create table test_user (
id varchar2(255 char) not null,
username varchar2(255 char),
card_id varchar2(255 char),
primary key (id)
);
alter table test_user
add constraint FKB9A96B58A237D846
foreign key (card_id)
references test_card;
个人认为,应该这样子理解OneToOne。
首先,他是用来申明在方法上的。(这句好似废话)
然后,他其实是用来描述这个方法的返回值的。即:描述TestCard的。也就是说:TestCard 为控制方。TestUser为被控方。那么对应的表中,test_user表有一个外键字段对应着test_card表中的一个主键。
这样,就好理解了。
上面的为单向关联。那么,双向关联呢?修改TestCard如下:
package net.paoding.forum.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class TestCard
{
String id;
String cardNumber;
TestUser user;
/**
* @return the id
*/
@Id
public String getId()
{
return id;
}
/**
* @param id the id to set
*/
public void setId(String id)
{
this.id = id;
}
/**
* @return the user
*/
@OneToOne
public TestUser getUser()
{
return user;
}
/**
* @param user the user to set
*/
public void setUser(TestUser user)
{
this.user = user;
}
/**
* @return the cardNumber
*/
public String getCardNumber()
{
return cardNumber;
}
/**
* @param cardNumber the cardNumber to set
*/
public void setCardNumber(String cardNumber)
{
this.cardNumber = cardNumber;
}
}
这样,产生的sql为:
drop table test_card cascade constraints;
drop table test_user cascade constraints;
create table test_card (
id varchar2(255 char) not null,
card_number varchar2(255 char),
user_id varchar2(255 char),
primary key (id)
);
create table test_user (
id varchar2(255 char) not null,
username varchar2(255 char),
card_id varchar2(255 char),
primary key (id)
);
alter table test_card
add constraint FKB9A0FA9D7876DA66
foreign key (user_id)
references test_user;
alter table test_user
add constraint FKB9A96B58A237D846
foreign key (card_id)
references test_card;
可以看到,当我双方都声明了OneToOne时候,也就达到了双向的One2One效果。但是很遗憾。Hibernate不知道你由哪边控制哪边,或者说由哪边来维护关系。所以,他生成的sql语句中可以看到,都有test_card和test_user是相互关联的,即:都有FK关联上堆放的PK。很明显,这个不是我们要的效果。
我们需要的是,po中能双向one2one,但是db中不需要。所以,我们需要修改一下。
修改TestCard.java代码:
package net.paoding.forum.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class TestCard
{
String id;
String cardNumber;
TestUser user;
/**
* @return the id
*/
@Id
public String getId()
{
return id;
}
/**
* @param id the id to set
*/
public void setId(String id)
{
this.id = id;
}
/**
* @return the user
*/
@OneToOne(mappedBy="card")
public TestUser getUser()
{
return user;
}
/**
* @param user the user to set
*/
public void setUser(TestUser user)
{
this.user = user;
}
/**
* @return the cardNumber
*/
public String getCardNumber()
{
return cardNumber;
}
/**
* @param cardNumber the cardNumber to set
*/
public void setCardNumber(String cardNumber)
{
this.cardNumber = cardNumber;
}
}
注意annotation的部分。mappedBy就指出了此处返回的TestUser对应的test_user表中有一个指向TestUser的属性"card"的外键。可以看sql。
drop table test_card cascade constraints;
drop table test_user cascade constraints;
create table test_card (
id varchar2(255 char) not null,
card_number varchar2(255 char),
primary key (id)
);
create table test_user (
id varchar2(255 char) not null,
username varchar2(255 char),
card_id varchar2(255 char),
primary key (id)
);
alter table test_user
add constraint FKB9A96B58A237D846
foreign key (card_id)
references test_card;
而这得"mappedBy=card"中的card是TestUser中的TestCard类型的成员变量名。这也就是为什么我要用Test修饰类名,而对象名却不用的理由。
或者,还可以这样子来理解OneToOne。
单向OneToOne中。声明了OneToOne这个Annotation的方法,他的返回值即:维护方。(主键方)
双向OneToOne中。在OneToOne中声明了mappedBy="xx"的,他的返回值即:被维护方。(外键方)
分享到:
相关推荐
而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上添加注解来简化数据库表和实体类之间的映射配置。这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java...
Hibernate是一个流行的ORM(对象关系映射)框架,它旨在解决Java面向对象编程与关系型数据库之间的模型不匹配问题,即“阻抗不匹配”。通过Hibernate,开发者可以使用面向对象的方式来操作数据库,而无需关心底层的...
hibernate是Java开发中的一款流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。在"5天入门hibernate"的学习计划中,你将深入理解hibernate的核心概念和基本...
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...
3. Annotation配置:相比于XML配置,使用Java注解可以更简洁地定义实体类和映射关系。 4. Mapping:对象到表的映射,包括一对一、一对多、多对一和多对多的关系映射。 5. Cascade:级联操作允许在一个实体的保存、...
**Hibernate类型与Oracle数据类型的映射关系**:例如,`java.lang.Long` 对应于Oracle的 `NUMBER` 类型,`java.lang.String` 对应 `VARCHAR2`,`java.lang.Double` 对应 `NUMBER`,`java.sql.Timestamp` 对应 `...
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...
5. **映射文件(Mapping File)**: `.hbm.xml`文件用于定义实体类与数据库表之间的映射关系,也可以使用注解方式(Annotation)来完成映射。 三、Hibernate配置 在使用Hibernate之前,需要进行一些基本的配置,包括...
**Annotation映射** 随着Java注解的流行,Hibernate也支持使用注解来代替XML进行映射。在`HbmUser`类中,我们可以看到如下注解: ```java @Entity @Table(name = "USER") public class HbmUser { @Id @...
本教程通过一系列课程,逐步讲解Hibernate的使用方法和核心概念。 在第1至第6课中,教程从基础入手,介绍了Hibernate的基本概念,包括UML图的使用,以及如何创建第一个简单的Hibernate项目`HibernateHelloWorld`。...
#### 一、HelloWorld与Hibernate入门 - **HelloWorld实践**:初学者应从创建一个简单的Java项目开始,名为`hibernate_0100_HelloWorld`,在此项目中引入`User-library-hibernate`,包含所有必要的jar包,并集成MySQL...
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...
本文将详细阐述Hibernate Validator的使用方法、验证机制、自定义约束以及通过XML配置验证器的实例和最佳实践。 ### Hibernate Validator基础 Hibernate Validator 5.1.3版本的参考文档主要分为以下几个部分: ##...
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...
### Java学习笔记——Java与Hibernate入门精要 #### 一、Java学习笔记概述 本学习笔记旨在帮助初学者系统地掌握Java语言的基础知识,并通过实际案例深入理解Hibernate框架的应用。通过对核心概念和技术点的详细解释...
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...
**Hibernate 程序入门详解** Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互。在这个教程中,我们将学习如何创建第一个 Hibernate 程序,采用 Annotation 版本,也...
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...