实体 Manager

package entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Table(name="managers") @Entity public class Manager { private Integer id; private String mgrName; /** * 一对一关联关系 */ private Department department; @GeneratedValue(strategy=GenerationType.AUTO) @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="MGR_NAME") public String getMgrName() { return mgrName; } public void setMgrName(String mgrName) { this.mgrName = mgrName; } /** * 对于不维护关系的一方(没有外外键的一方) ,使用@OneToOne 来进行映射,建议设置mappedBy=true * 同时,使用了mappedBy属性,不能同时使用@JoinColumn,否组会抛出异常 * @return */ //@JoinColumn(name="MGR_ID") @OneToOne(mappedBy="manager",fetch=FetchType.LAZY) //不维护,使用对方的manager来维护 public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
实体 Department

package entity; import static org.junit.Assert.assertTrue; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Table(name="department") @Entity public class Department { private Integer id; private String deptName; private Manager manager; @GeneratedValue @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } /** * 使用@OnetoOne 映射一对一的关联关系 * 如要在当前表中添加主键。则需要使用@JoinColumn ,说明,一对一关系,需要添加unique=true * @return */ @JoinColumn(name="MGR_ID",unique=true ) @OneToOne public Manager getManager() { return manager; } public void setManager(Manager manager) { this.manager = manager; } @Column(name="DEPT_NAME") public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } }
测试 OneToOnetest

package test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.FetchType; import javax.persistence.Persistence; import org.junit.After; import org.junit.Before; import org.junit.Test; import entity.Department; import entity.Manager; public class OneToOneTest { private EntityManagerFactory entityManagerFactory; private EntityManager entityManager; private EntityTransaction entityTransaction; @Before public void init() { entityManagerFactory = Persistence.createEntityManagerFactory("JPA"); entityManager = entityManagerFactory.createEntityManager(); entityTransaction = entityManager.getTransaction(); entityTransaction.begin(); } @After public void distory() { entityTransaction.commit(); entityManager.close(); entityManagerFactory.close(); } /** * 若查找不维护的一方,默认也是通过左外链接获取其关联对象 * 可以通过 @OneToOne(fetch=FetchType.LAZY)来修改, *但是依然会发送sql语句来初始化其关联对象 ,不建议修改fetch属性 */ @Test public void testfind1(){ Manager manager = entityManager.find(Manager.class, 22); System.out.println(manager.getMgrName()); Department department = manager.getDepartment(); System.out.println(department.getDeptName()); } /** * 若查找维护的一方,默认也是通过左外链接获取其关联对象 *可以通过 @OneToOne(fetch=FetchType.LAZY)来修改 */ @Test public void testfind2(){ Department department = entityManager.find(Department.class, 21); System.out.println(department.getDeptName()); System.out.println(department.getManager().getMgrName()); } /** * 双向一对一关系,建议先保存不维护关系的一方(没有外键的),这样不会产生update语句 */ @Test public void testPersistence() { Manager manager = new Manager(); manager.setMgrName("AAA"); Department department = new Department(); department.setDeptName("BBB"); // set associate 设置关联 manager.setDepartment(department); department.setManager(manager); // 双向一对一关系,建议先保存不维护关系的一方(没有外键的),这样不会产生update语句 entityManager.persist(manager); entityManager.persist(department); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?