Follow Me:深入浅出学习Hibernate五:Hibernate关联映射一对一

一对一映射种类

一对一主键关联映射(单向)

一对一主键关联映射(双向)

一对一唯一外键关联映射(单向)

一对一唯一外键关联映射(双向)

具体分析

一对一主键关联映射(单向)

关系模型:一个用户一张身份证,一个张省份证对应一个用户,这就是一个一对一的模型。hibernate一对一主键关联映射(单向关联Person----->IdCard


用例图

数据库模型


一对一关联映射原理:让两个实体的主键一样,这样就不需要加入多余的字段了

<class name="com.bjpowernode.hibernate.Person" table="t_person">
	<id name="id">
		<!-- 采用foreign生成策略,forgeign会取得关联对象的标识 -->
		<generator class="foreign">
			<!-- property只关联对象 -->
			<param name="property">idCard</param>
		</generator>
	</id>
	<property name="name"/>
	<!-- 
		one-to-one指示hibernate如何加载其关联对象,默认根据主键加载也就是拿到关系字段值,根据对端的主键来加载关联对象	
		constrained="true表示,当前主键(person的主键)还是一个外键参照了对端的主键(IdCard的主键),也就是会生成外键约束语句
	 -->
	<one-to-one name="idCard" constrained="true"/>
</class>

一对一主键关联映射(双向)

hibernate一对一主键关联映射(双向关联Person<----->IdCard

用例图


数据库模型


需要在IdCard加入<one-to-one>标签,指示hibernate将关联对象Person

一对一唯一外键关联映射(单向)

用例图


数据库模型

hibernate

一对一唯一外键关联映射(单向关联Person----->IdCard

一对一唯一外键关联映射其实是多对一的特例

采用

<many-to-one>

标签来映射,指定多的一端uniquetrue,这样就限制了多的一端的多重性为一,就是这样来映射的。

一对一唯一外键关联映射(双向)

用例图


数据库模型


hibernate

一对一唯一外键关联映射(双向关联Person<----->IdCard

一对一唯一外键关联双向采用

<one-to-one>标签映射,必须指定<one-to-one>

标签中的

property-ref属性为关系字段的名称

总结

主要就是<one-to-one>应用。

### 测试工具及框架 对于分模块测试Controller、Service、DAO以及实体Bean,存在多种有效的工具和框架可以满足不同层次的需求。 #### 单元测试与集成测试概述 单元测试主要关注于单个组件的功能验证,而集成测试则侧重于多个组件之间的交互。针对不同的层级(Controller, Service, DAO 和 Entity),有不同的最佳实践和技术栈来确保代码质量[^1]。 #### Controller 层测试 为了有效地测试控制器层的行为,推荐使用Spring MVC Test库。该库允许开发者模拟HTTP请求并检验响应结果而不必启动整个Web应用程序上下文。这不仅提高了测试速度也简化了配置过程。 ```java @RunWith(SpringRunner.class) @WebMvcTest(controllers = MyController.class) public class MyControllerTests { @Autowired private MockMvc mockMvc; @MockBean private MyService myService; // Tests go here... } ``` 此方式能够快速验证API端点是否按预期工作,并且可以通过`@MockBean`轻松替换掉实际的服务实现以便隔离测试[^2]. #### Service 层测试 服务层通常包含了核心业务逻辑,在这里JUnit配合 Mockito 是非常流行的选择。通过这种方式可以在不依赖外部资源的情况下对复杂的业务场景进行全面覆盖。 ```java @RunWith(MockitoJUnitRunner.class) public class MyServiceTests { @InjectMocks private MyService serviceUnderTest; @Mock private Repository repository; // Write tests that exercise the business logic... } ``` 上述设置使得编写独立性强的单元测试成为可能,同时保持高效率和准确性[^3]. #### DAO/Repository 层测试 当涉及到持久化操作时,HSQLDB 或 H2内存数据库常被用来代替真实的生产环境数据库来进行高效的开发期测试。结合JPA/Hibernate等ORM框架提供的功能,可以构建出既贴近真实又易于管理的数据访问层测试案例。 ```java @SpringBootTest @TestPropertySource(locations="classpath:test.properties") @Transactional public class UserRepositoryIntegrationTests { @Autowired private UserRepository userRepository; // Integration test methods follow... } ``` 这种做法有助于捕捉潜在的问题比如查询语句错误或是映射关系不当等问题,同时也支持事务回滚机制以保护测试数据的一致性[^4]. #### 实体 Bean 测试 虽然实体本身相对简单,但是它们承载着重要的领域概念并且经常与其他部分紧密关联。因此,即便是在最基础层面也需要对其进行适当校验。AssertJ是一个强大的断言库可以帮助写出更加清晰易读的实体验证代码: ```java import static org.assertj.core.api.Assertions.*; // Inside a JUnit test method: User user = new User(); user.setName("John Doe"); assertThat(user.getName()).isEqualToIgnoringCase("john doe"); ``` 利用这样的工具可以让简单的属性检查变得直观而且不易出错[^5].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值