one to one 主键关联

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjsxt.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="foreign">
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>

 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person"/>
	</class>
</hibernate-mapping>

 

 

 

 

 

 

单向

 

hibernate一对一主键关联映射(单向关联Person---->IdCard)

一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建

具体映射:

 <id name="id">
  <!-- person的主键来源idCard,也就是共享idCard的主键 -->
  <generator class="foreign">
   <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"/>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.yelang.hibernate.IdCard" table="t_idcard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>

 

 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjsxt.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="foreign">
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>

 

在数据库查询或ORM框架中,`selectOne`操作通常用于获取单条记录。然而,有时该操作可能仅返回主键而非完整记录,这通常由查询定义、映射配置或数据库行为引起。以下是一些可能的原因及对应的解决方法。 ### 查询定义问题 如果`selectOne`操作中使用的SQL语句或查询逻辑仅指定主键字段,则结果集可能仅包含主键值。这种情况常见于手动编写的SQL查询或某些ORM框架的查询构造器中。确保查询语句中包含所有需要返回的字段,而不仅仅是主键字段。 ```sql -- 错误示例,仅返回主键 SELECT id FROM users WHERE username = 'example_user'; -- 正确示例,返回完整记录 SELECT * FROM users WHERE username = 'example_user'; ``` ### ORM映射配置问题 在使用如MyBatis、Hibernate等ORM框架时,如果实体类的映射配置不完整或查询结果未正确绑定到实体类属性,则可能导致仅主键字段被填充[^1]。检查实体类的注解或XML映射文件,确保所有字段都有正确的映射定义。 ```java // 示例:MyBatis实体类映射 public class User { private Integer id; private String username; private String email; // Getter和Setter } ``` ### 数据库行为问题 某些数据库或框架可能在特定条件下默认仅返回主键。例如,在某些ORM实现中,如果查询条件基于唯一索引字段,框架可能优化查询以减少数据传输量,仅获取主键信息。查阅所使用的数据库或框架文档,确认其行为逻辑,并根据需要调整查询策略。 ### 查询缓存或懒加载问题 在某些情况下,ORM框架可能延迟加载实体的非关键字段,导致`selectOne`操作返回的实体对象在初次访问非关键字段时才触发实际的数据库查询。这种行为通常由懒加载配置引起。确保在需要立即加载所有字段的情况下,使用适当的关联加载策略。 ```java // 示例:Hibernate立即加载关联实体 @OneToOne(fetch = FetchType.EAGER) private Profile profile; ``` ### 总结 解决`selectOne`查询仅返回主键的问题通常涉及检查查询语句是否完整、ORM映射配置是否正确、以及框架行为是否符合预期。通过调整查询定义、优化映射配置或调整加载策略,可以确保查询返回完整的记录数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值