码农小汪-Hibernate学习7-hibernate映射组件属性

2024-08-21 00:58

本文主要是介绍码农小汪-Hibernate学习7-hibernate映射组件属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

组件属性

组件属性到底是什么意思:持久化类的实体的属性并不是基本的数据类型,也不是字符串,日期等标量类型的变量,而是一个复合类型的对象。在持久化的过程中仅仅被当作值类型,而非引用另一个持久化实体
组件属性的类型可以是自己自定义的任何类

看使用就晓得了:Name是个组件属性,我们不能简单的根据@Column简单的使用涩

@Entity
@Table(name="person_inf")
public class Person
{@Id @Column(name="person_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private int age;// 组件属性name,什么都没有做private Name name;// id的setter和getter方法public void setId(Integer id){this.id = id;}public Integer getId(){return this.id;}// age的setter和getter方法public void setAge(int age){this.age = age;}public int getAge(){return this.age;}// name的setter和getter方法public void setName(Name name){this.name = name;}public Name getName(){return this.name;}
}

下面是定义我们的组件
这个@Embeddable修饰的类,表明这个是个组件,组件类中使用@Cloumn表明在实体中对应的列
@Parent 告知Hibernate owner不是个普通的属性,而是包含Name属性的person实体

@Embeddable 嵌入的意思
public class Name
{// 定义first成员变量@Column(name="person_firstname")private String first;// 定义last成员变量@Column(name="person_lastname")private String last;// 引用拥有该Name的Person对象@Parent      // ①private Person owner;// 无参数的构造器public Name(){}// 初始化全部成员变量的构造器public Name(String first , String last){this.first = first;this.last = last;}// first的setter和getter方法public void setFirst(String first){this.first = first;}public String getFirst(){return this.first;}// last的setter和getter方法public void setLast(String last){this.last = last;}public String getLast(){return this.last;}// owner的setter和getter方法public void setOwner(Person owner){this.owner = owner;}public Person getOwner(){return this.owner;}}

除此之外,Hibernate还提供了另外的一种映射策略,无需再组件上使用使用@Embeddable注解,而是直接在持久化类中使用@Embedd修饰组件,如果需要为组件的子属性指定列名,可以使用@AttributeOverrides(name=”哪个属性“,Column=@Colunm(name=”XXXX“))
不需要记得,大概晓得这回事就行了。文档自己找
代码

public class Name
{// 定义first成员变量private String first;// 定义last成员变量private String last;// 引用拥有该Name的Person对象@Parentprivate Person owner;
}
Name上面么得啦,parent还是有的,这个和Transient差不多,不要这个属性,但是有多了层意思@Embedded@AttributeOverrides({@AttributeOverride(name="first", column = @Column(name="person_firstname")),@AttributeOverride(name="last", column = @Column(name="person_lastname"))})private Name name;

组件作为复合主键

这种情况下,还是有些特殊的操作的
组件满足,无参够造函数 ,实现序列话接口,从写equals()和hasCode方法,也就是根据此区分组件对象类似hash
当使用复合主键是,Hibernate无法为你主动的生成主键值,程序必须为持久化对象分配主键实例。
当持久化的主键为联合主键是,程序需要使用@Embeddedld来修饰该主键,和之前讲的类似,主要是现在是主键啦

为了标识唯一的属性,从写下面的来个方式哦,这些是必须的

public class Nameimplements java.io.Serializable
{// 定义first成员变量private String first;// 定义last成员变量private String last;// 无参数的构造器public Name(){}// 初始化全部成员变量的构造器public Name(String first , String last){this.first = first;this.last = last;}// first的setter和getter方法public void setFirst(String first){this.first = first;}public String getFirst(){return this.first;}// last的setter和getter方法public void setLast(String last){this.last = last;}public String getLast(){return this.last;}// 重写equals()方法,根据first、last进行判断public boolean equals(Object obj){if (this == obj){return true;}if (obj != null && obj.getClass() == Name.class){Name target = (Name)obj;return target.getFirst().equals(getFirst())&& target.getLast().equals(getLast());}return false;}// 重写hashCode()方法,根据first、last计算hashCode值public int hashCode(){return getFirst().hashCode() * 31+ getLast().hashCode();}
}

看我们的实体类

@Entity
@Table(name="person_inf")
public class Person
{// 以Name组件作为标识属性@EmbeddedId@AttributeOverrides({// 指定@AttributeOverride(name="first",column = @Column(name="person_firstname")),@AttributeOverride(name="last",column = @Column(name="person_lastname"))})private Name name;private int age;// name的setter和getter方法public void setName(Name name){this.name = name;}public Name getName(){return this.name;}// age的setter和getter方法public void setAge(int age){this.age = age;}public int getAge(){return this.age;}
}

多列作为联合主键

和我们上面的组件作为联合,其实效果意义都是一样的,就是分开写而已嘛,是不是。我们主要是 区分hash不一样,怎么去标识一个为主键呢
和上面的要求一样的都需要无参构造 序列化 Hash区分

将持久化类直接使用多个@Id就行了,修饰这些属性。

@Entity
@Table(name="person_inf")
public class Personimplements java.io.Serializable
{// 定义first属性,作为标识属性的成员@Idprivate String first;// 定义last属性,作为标识属性的成员@Idprivate String last;private int age;// first的setter和getter方法public void setFirst(String first){this.first = first;}public String getFirst(){return this.first;}// last的setter和getter方法public void setLast(String last){this.last = last;}public String getLast(){return this.last;}// age的setter和getter方法public void setAge(int age){this.age = age;}public int getAge(){return this.age;}// 重写equals()方法,根据first、last进行判断public boolean equals(Object obj){if (this == obj){return true;}if (obj != null && obj.getClass() == Person.class){Person target = (Person)obj;return target.getFirst().equals(getFirst())&& target.getLast().equals(getLast());}return false;}// 重写hashCode()方法,根据first、last计算hashCode值public int hashCode(){return getFirst().hashCode() * 31+ getLast().hashCode();}
}

这篇关于码农小汪-Hibernate学习7-hibernate映射组件属性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091665

相关文章

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

HTML5中下拉框<select>标签的属性和样式详解

《HTML5中下拉框<select>标签的属性和样式详解》在HTML5中,下拉框(select标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中选择值的方式,本文将深入探讨select标签的... 在html5中,下拉框(<select>标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb