【hibernate】映射可嵌入式组件
【hibernate】映射可嵌入式组件
转载:https://www.cnblogs.com/yangchongxing/p/10376452.html
可嵌入 Address 类,没有对应的数据表
package cn.ycx.study.hibernate.entity; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.validation.constraints.NotNull; @Embeddable public class Address { @NotNull @Column(nullable=false) protected String street; @NotNull @Column(nullable=false) protected String zipcode; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } }
1、映射可嵌入组件
package cn.ycx.study.hibernate.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @org.hibernate.annotations.DynamicInsert @org.hibernate.annotations.DynamicUpdate public class User { @Id @GeneratedValue(generator="id_generator") protected long id; protected String username; //嵌入式组件 protected Address address; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
产生的数据库表
CREATE TABLE `user` ( `id` BIGINT(20) NOT NULL, `street` VARCHAR(255) NOT NULL, `zipcode` VARCHAR(255) NOT NULL, `username` VARCHAR(255) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ;
2、重写映射可嵌入组件
package cn.ycx.study.hibernate.entity; import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @org.hibernate.annotations.DynamicInsert @org.hibernate.annotations.DynamicUpdate public class User { @Id @GeneratedValue(generator="id_generator") protected long id; protected String username; //嵌入式组件 protected Address address; @AttributeOverrides({ @AttributeOverride( name = "street", column = @Column(name = "order_street") ), @AttributeOverride( name = "zipcode", column = @Column(name = "order_zipcode") ) }) protected Address orderAddress; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Address getOrderAddress() { return orderAddress; } public void setOrderAddress(Address orderAddress) { this.orderAddress = orderAddress; } }
产生的数据库表
CREATE TABLE `user` ( `id` BIGINT(20) NOT NULL, `street` VARCHAR(255) NOT NULL, `zipcode` VARCHAR(255) NOT NULL, `order_street` VARCHAR(255) NULL DEFAULT NULL, `order_zipcode` VARCHAR(255) NULL DEFAULT NULL, `username` VARCHAR(255) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ;
3、映射嵌套的可嵌入组件
可嵌入 Address 类中嵌套 City 类
package cn.ycx.study.hibernate.entity; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.validation.constraints.NotNull; @Embeddable public class Address { @NotNull @Column(nullable=false) protected String street; @NotNull @Column(nullable=false) protected String zipcode; public String getStreet() { return street; } @NotNull protected City city; public void setStreet(String street) { this.street = street; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } public City getCity() { return city; } public void setCity(City city) { this.city = city; } }
嵌套 City 类
package cn.ycx.study.hibernate.entity; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.validation.constraints.NotNull; @Embeddable public class City { @NotNull @Column(nullable=false) protected String country; @NotNull @Column(nullable=false) protected String name; public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
用户表
package cn.ycx.study.hibernate.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @org.hibernate.annotations.DynamicInsert @org.hibernate.annotations.DynamicUpdate public class User { @Id @GeneratedValue(generator="id_generator") protected long id; protected String username; //可嵌入式组件 protected Address address; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
产生的数据库表
CREATE TABLE `user` ( `id` BIGINT(20) NOT NULL, `country` VARCHAR(255) NOT NULL, `name` VARCHAR(255) NOT NULL, `street` VARCHAR(255) NOT NULL, `zipcode` VARCHAR(255) NOT NULL, `username` VARCHAR(255) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ;
这种嵌套关系理论上是可以嵌套无数层
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南