java hibernate注解简单使用
- 格式:docx
- 大小:96.50 KB
- 文档页数:8
Hibernate关联关系注解配置简单理解Hibernate关联关系注解配置什么是关联关系?关联关系有哪⼏种?关联关系指实体之间的关系,也就是表与表之间的关系。
⼀个关系⽤两个属性来描述,数量性和⽅向性。
从数量上来看,表与表之间主要有三种关系,⼀对⼀,⼀对多,多对多。
加上关系的⽅向,还有⼀个多对⼀。
hibernate中关联关系的维护在实际的业务开发中,对于两个有关联的数据库实体,⽐如学⽣对教室,我们通常还需要在操作⼀⽅时,维护两⽅彼此之间的关系。
关系的维护分为两类:1.级联Cascade,在操作⼀⽅时,是否对另⼀⽅也执⾏同样的操作。
2.外键的维护inverse,在操作⼀⽅时,是否⾃动维护外键关系。
⽐如如果将多⽅的对象添加给以⼀的⼀⽅,因为外键由多⽅维护,hibernate 为了保证添加的这个多⽅对象的外键是正确的,会⾃动给这个多⽅的外键设置值(也就是⼀的⼀⽅的主键)外键维护,在xml配置中使⽤inverse属性,在注解中使⽤mappedBy注解来声明。
cascade与inverse1.cascade,指把对当前对象的操作级联到关联对象上。
⼀般在one to one ,one to many设置级联。
配置了这个属性后,当对当前对象执⾏如save等更新数据库的操作时,当前实体所关联的实体也会执⾏相应的操作。
2.inverse默认值为true, 表⽰让对⽅来维护关系。
设为false,⾃⼰维护关系。
inverse主要有两个作⽤:1)维护外键主控⽅保存时,是否⾃动update被控⽅的外键字段。
外键字段指向的就是当前保存的实体。
2)维护级联决定当前设置的级联是否有⽤,⾃⼰维护关系时,对⽅设置的级联就不会⽣效,对⽅保存时不会让本⽅也保存。
⽽对⽅维护关系,则与此相反。
@mappedBy注解1)mappedBy(name="对⽅标准代表当前实体的属性“)2)只存在于OneToOne,OneToMany,ManyToMany, 不能在ManyToOne中3)与joincolumn或jointable互斥。
Hibernate的save方法1. 简介Hibernate是一个开源的Java持久化框架,它提供了一种方便的方式来将Java对象映射到关系数据库中。
在Hibernate中,save方法是用于将一个对象保存到数据库中的方法之一。
本文将详细介绍Hibernate的save方法的使用方式、参数、返回值和注意事项。
2. save方法的使用方式在Hibernate中,使用save方法将一个对象保存到数据库中非常简单。
首先,需要创建一个SessionFactory对象,该对象是Hibernate的核心对象,用于创建Session对象。
然后,通过Session对象调用save方法来保存对象。
下面是一个简单的示例代码:SessionFactory sessionFactory = new Configuration().configure().buildSessionFa ctory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();MyObject myObject = new MyObject();// 设置对象的属性myObject.setName("John");myObject.setAge(25);session.save(myObject);mit();session.close();在上面的示例中,我们首先创建了一个SessionFactory对象,然后打开一个Session对象,并开启了一个事务。
接下来,创建了一个MyObject对象,并设置了其属性。
最后,通过调用session的save方法将对象保存到数据库中。
最后,我们提交事务并关闭Session。
3. save方法的参数save方法接受一个对象作为参数,该对象将被保存到数据库中。
Hibernate注解中CascadeType用法汇总在Hibernate中,CascadeType注解用来配置实体之间的级联操作。
级联操作是指在对一个实体进行持久化、更新、删除等操作时,同时也对关联的其他实体进行相应的操作。
CascadeType注解常用于一对一、一对多、多对多等关联关系中。
CascadeType注解的常用取值有以下几种:1. CascadeType.ALL:表示所有的级联操作,包括持久化、更新、删除等。
2. CascadeType.PERSIST:表示级联持久化操作,即当实体被持久化时,关联的其他实体也会被持久化。
3. CascadeType.MERGE:表示级联更新操作,即当实体被更新时,关联的其他实体也会被更新。
4. CascadeType.REMOVE:表示级联删除操作,即当实体被删除时,关联的其他实体也会被删除。
5. CascadeType.REFRESH:表示级联刷新操作,即当实体被刷新时,关联的其他实体也会被刷新。
6. CascadeType.DETACH:表示级联脱管操作,即当实体脱管时,关联的其他实体也会被脱管。
7. CascadeType.ALL_DELETE_ORPHAN:表示级联删除操作,并且会删除所有孤儿实体。
下面是对CascadeType注解的使用方法进行汇总:1.一对一关联关系:```private Address address;```上述代码表示当保存、更新或删除一个实体对象时,操作对应的address实体也会被保存、更新或删除。
2.一对多关联关系:```private List<Order> orders;```上述代码表示当保存、更新或删除一个用户对象时,操作对应的所有订单对象也会被保存、更新或删除。
3.多对多关联关系:```private List<Role> roles;```上述代码表示当保存、更新或删除一个用户对象时,操作对应的所有角色对象也会被保存、更新或删除。
hibernate-validator常用注解Hibernate-Validator 是一个用来验证 bean 属性的开源框架,它通过使用 Java 语言编写的注释来校验 bean 属性的值是否有效,也可以用于开发高质量 Java 应用程序。
Hibernate-Validator 提供了大量的注解,可以在简单的方式对 bean 属性值进行校验,以确保属性值的有效性。
1. @NotNull:该注解用于校验 bean 属性值不能为 null,null 时会抛出 ConstraintViolationException 异常;2. @Null:该注解用于校验 bean 属性值必须为 null,不为null 时会抛出 ConstraintViolationException 异常;3. @AssertTrue:该注解用于校验 bean 属性值必须为 true,为false 时会抛出 ConstraintViolationException 异常;4. @AssertFalse:该注解用于校验 bean 属性值必须为 false,为 true 时会抛出 ConstraintViolationException 异常;5. @Min:该注解用于校验 bean 属性的数值必须大于等于@Min 指定的值,小于指定值时会抛出 ConstraintViolationException 异常;6. @Max:该注解用于校验 bean 属性的数值必须小于等于@Max 指定的值,大于指定值时会抛出 ConstraintViolationException 异常;7. @DecimalMin:该注解用于校验 bean 属性的数值必须大于等于@DecimalMin 指定的值,小于指定值时会抛出ConstraintViolationException 异常;8. @DecimalMax:该注解用于校验 bean 属性的数值必须小于等于@DecimalMax 指定的值,大于指定值时会抛出ConstraintViolationException 异常;9. @Size:该注解用于校验 bean 属性值的长度,当属性值的长度不符合@Size 指定的范围时会抛出 ConstraintViolationException 异常;10. @Digits:该注解用于校验 bean 属性值的数字格式,不符合数字格式时会抛出 ConstraintViolationException 异常;11. @Past:该注解用于校验 bean 属性值是一个过去的日期,不是过去的日期时会抛出 ConstraintViolationException 异常;12. @Future:该注解用于校验 bean 属性值是一个未来的日期,不是未来的日期时会抛出 ConstraintViolationException 异常;13. @Pattern:该注解用于校验 bean 属性值是否符合指定的正则表达式,不符合时会抛出 ConstraintViolationException 异常;14. @Email:该注解用于校验 bean 属性值是否为邮件地址,不是邮件地址时会抛出 ConstraintViolationException 异常;15. @Length:该注解用于校验 bean 属性值的长度,不符合长度范围会抛出 ConstraintViolationException 异常;16. @NotBlank:该注解用于校验 bean 属性字符串不能为 null 和空字符串,null 或空字符串时会抛出ConstraintViolationException 异常;17. @NotEmpty:该注解用于校验 bean 属性值不能为 null 或者为空集合,null 或空集合时会抛出 ConstraintViolationException 异常;18. @Range:该注解用于校验 bean 属性的数值或字符串的长度在指定的范围内,不在指定范围时会抛出ConstraintViolationException 异常;19. @CreditCardNumber:该注解用于校验 bean 属性值是否为信用卡号,不是信用卡号时会抛出 ConstraintViolationException 异常;20. @ScriptAssert:该注解用于校验 bean 属性值是否满足一个脚本表达式,不满足时会抛出 ConstraintViolationException 异常。
java有效的注释说明Java是一种广泛使用的编程语言。
为了保证代码的清晰易懂以及方便后期维护,我们要给Java程序添加注释。
本文将从以下几个方面介绍Java有效的注释说明。
一、注释的种类Java程序中最常见的注释有三种:单行注释、多行注释、文档注释。
单行注释以"//"开头,多行注释以"/*"开头和"*/"结尾,文档注释以"/**"开头和"*/"结尾。
其中,文档注释最为重要,也最为常用。
二、文档注释的使用文档注释是Java程序中的重要注释,也是Java代码中最常用的注释之一。
文档注释可以让我们用简洁清晰的语言来描述代码的作用、参数、返回值等信息。
其具体写法如下:/*** <p>方法的作用</p>* @param 参数名参数说明* @return 返回值说明*/其中,p标签可以用来描述方法的作用,param标签用来描述参数的名称和说明,return标签用于描述方法的返回值。
三、注释的规范在Java中,注释也是需要遵循一定的规范的。
首先,注释应该写在被注释项的前面或者后面,不需要对齐代码。
其次,注释应该简洁明了,避免出现过于冗长的注释。
最后,避免在注释中出现包含比代码本身还复杂的格式和语法。
四、注释的使用场景注释的使用场景包括以下几个方面:首先,注释可以用来描述程序中的重要变量、方法、类的作用和功能。
其次,注释可以在调试程序时帮助快速定位问题所在。
最后,注释还可以在代码交接、阅读和修改时提供较为清晰的方向和思路。
综上所述,Java有效的注释是保证代码清晰易懂、方便维护的重要方面之一。
Java程序员应该养成良好的注释习惯,在代码编写上也应该注重注释的规范性、简洁性和对实际需求的协调性。
一、介绍Hibernate框架Hibernate是一个开源的对象关系映射(ORM)框架,它通过将Java 对象和数据库表进行映射,使得开发者可以使用面向对象的方式进行数据库操作。
Hibernate的主要优势在于提供了简洁的API和灵活的查询语言,同时还具有良好的性能和对不同数据库的广泛支持。
二、介绍byte[]类型在Java中,byte[]是一个存储字节序列的数组,它可以用来存储任意类型的数据。
在数据库操作中,我们有时会遇到需要将图片、文件等二进制数据存储到数据库中的情况,这时就需要使用byte[]类型来处理这些数据。
三、Hibernate中存储byte[]的方法1. 使用Lob注解在Hibernate中,可以通过Lob注解将byte[]类型的数据映射到数据库的BLOB字段。
Lob注解可以用于基本数据类型和Serializable类型,将它们映射到对应的CLOB或BLOB字段。
```javaLobColumn(name = "image", nullable = false, columnDefinition = "longblob")private byte[] image;```2. 使用自定义类型除了使用Lob注解外,还可以通过自定义类型来处理byte[]类型的数据。
这种方式可以将二进制数据按照特定的规则进行处理,例如使用Base64编码、压缩等操作,然后再存储到数据库中。
通过自定义类型,可以更好地控制数据的存储和读取过程。
```javaType(type = .example.CustomBlobType")Column(name = "image", nullable = false)private byte[] image;```3. 使用二进制类型在使用Hibernate操作数据库时,我们还可以通过显式声明字段的数据库类型来存储byte[]类型的数据。
Hibernate注解常用的hibernate annotation标签如下:@Entity--注释声明该类为持久类。
@Table(name="promotion_info")--持久性映射的表(表名="promotion_info)。
@Column(name=”DESC”,nullable=false,length=512)--用于指定持久属性或字段的映射列。
@Id--注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。
@GeneratedValue--定义自动增长的主键的生成策略。
@Transient--将忽略这些字段和属性,不用持久化到数据库。
@Temporal(TemporalType.TIMESTAMP)--声明时间格式。
@Enumerated--声明枚举@Version--声明添加对乐观锁定的支持@OneToOne--可以建立实体bean之间的一对一的关联@OneToMany--可以建立实体bean之间的一对多的关联@ManyToOne--可以建立实体bean之间的多对一的关联@ManyToMany--可以建立实体bean之间的多对多的关联@Formula--一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)@OrderBy--Many端某个字段排序(List)下面是对以上常用Hibernate注解标签的详细介绍与举例:@Entity--注释声明该类为持久类。
将一个Javabean类声明为一个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解.@Table(name="promotion_info")--持久性映射的表(表名="promotion_info).@T able是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名.示例:@Entity@T able(name="CUST", schema="RECORDS")public class Customer { ... }@Column(name=”DESC”,nullable=false,length=512)--用于指定持久属性或字段的映射列。
hibernate-validator的基本使⽤validator是⽤来校验参数使⽤!⼀般来说校验参数的⼯作可以放在前端去执⾏,但是假如有⼈不经过前端直接调⽤后端的接⼝呢?很可能就出现⾮法数据⽽导致⼀些问题,所有服务端也要做数据的校验。
前端校验是为了提⾼⽤户的体验度,后端校验则是为了保证数据的安全性。
校验参数基本上是⼀个体⼒活,⽽且冗余代码繁多,也影响代码的可读性,我们需要⼀个⽐较优雅的⽅式来解决这个问题。
Hibernate Validator 框架刚好解决了这个问题,可以以很优雅的⽅式实现参数的校验,让业务代码和校验逻辑分开,不再编写重复的校验逻辑。
hibernate-validator优势: 1.验证逻辑与业务逻辑之间进⾏了分离,降低了程序耦合度2.统⼀且规范的验证⽅式,⽆需你再次编写重复的验证代码 3.你将更专注于你的业务,将这些繁琐的事情统统丢在⼀边hibernate-validator的maven坐标:其实spring-boot-starter-web中已经依赖了hibernate-validator<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.18.Final</version></dependency>hibernate-validator提供的校验⽅式为在类的属性上加⼊相应的注解来达到校验的⽬的。
hibernate-validator提供的⽤于校验的注解如下:注解说明@AssertTrue⽤于boolean字段,该字段只能为true@AssertFalse⽤于boolean字段,该字段只能为false@CreditCardNumber对信⽤卡号进⾏⼀个⼤致的验证@DecimalMax只能⼩于或等于该值@DecimalMin只能⼤于或等于该值@Email检查是否是⼀个有效的email地址@Future检查该字段的⽇期是否是属于将来的⽇期@Length(min=,max=)检查所属的字段的长度是否在min和max之间,只能⽤于字符串@Max该字段的值只能⼩于或等于该值@Min该字段的值只能⼤于或等于该值@NotNull不能为null@NotBlank不能为空,检查时会将空格忽略@NotEmpty不能为空,这⾥的空是指空字符串@Pattern(regex=)被注释的元素必须符合指定的正则表达式@URL(protocol=,host,port)检查是否是⼀个有效的URL,如果提供了protocol,host等,则该URL还需满⾜提供的条件⼊门案例<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/></parent><groupId>com.xiaoteng</groupId><artifactId>validator-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--spring-boot-starter-web中已经依赖了hibernate-validator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.18.Final</version></dependency>--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies></project>实体类package com.entity;import lombok.Data;import org.hibernate.validator.constraints.Length;import javax.validation.constraints.*;/*** @author xiaozhuang* @date 2022年02⽉26⽇ 14:03*/@Datapublic class User {@NotNull(message = "⽤户id不能为空(null)")private int id;@NotEmpty(message = "⽤户名不能为空")@Length(max = 50, message = "⽤户名长度不能超过50")private String userName;@Max(value = 100, message = "年龄最⼤为100")@Min(value = 18, message = "年龄最⼩为18")private int age;@Pattern(regexp = "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$",message = "邮箱格式不正确")private String email;}controllerpackage com.controller;import er;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.constraints.NotBlank;/*** @author xiaozhuang* @date 2022年02⽉26⽇ 14:13*/@RestController@RequestMapping("/user")@Validated //开启校验功能public class UserController {//简单数据类型校验@RequestMapping("/byId")public String delete(@NotBlank(message = "id不能为空") String id){ System.out.println("id为..." + id);return "OK";}//对象属性校验@RequestMapping("/save")public String save(@Validated User user){System.out.println("save..." + user);return "OK";}}package com;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication; import javax.swing.*;/*** @author xiaozhuang* @date 2022年02⽉26⽇ 14:18*/@SpringBootApplicationpublic class ValidatorApp {public static void main(String[] args) {SpringApplication.run(ValidatorApp.class,args);}}启动项⽬,然后访问。
hibernate validator 多注解顺序Hibernate Validator是一个用于Java Bean验证的开源框架,它提供了一系列的注解来验证数据的合法性。
在实际开发中,我们经常需要对一个属性进行多个验证,这就涉及到了多个注解的使用顺序的问题。
本文将详细介绍Hibernate Validator多注解的顺序问题,并给出一步一步的解答。
第一步:了解Hibernate Validator多注解的顺序问题在Hibernate Validator中,每个注解都有其特定的验证逻辑。
在使用多个注解进行验证时,验证的顺序将直接影响验证的结果。
因此,正确的注解顺序是至关重要的。
第二步:分析Hibernate Validator多注解的验证逻辑Hibernate Validator中的每个注解都有其验证逻辑,它们可以分为两大类:基本约束注解和组合约束注解。
基本约束注解是直接对属性进行验证的注解,例如@NotNull、@NotEmpty和@Pattern等。
它们可以独立使用,即单个注解就可以完成验证。
组合约束注解是对一组注解进行组合,形成一个复合注解来完成验证,例如@Email、@CreditCardNumber和@Size等。
这类注解的验证逻辑比较复杂,需要按照特定的顺序依次执行。
第三步:确定多注解的顺序要求在实际开发中,我们通常需要对一个属性进行多个验证,这就需要确定多个注解的顺序要求。
一般情况下,基本约束注解应该放在组合约束注解之前,以保证基本约束的验证先于组合约束的验证。
第四步:示例演示为了更好地理解Hibernate Validator多注解的顺序问题,我们将通过一个示例演示。
假设我们要对用户的密码进行验证,要求密码不能为空、长度在6到20之间,并且只能包含字母和数字。
首先,我们需要使用@NotBlank注解来验证密码不能为空:java@NotBlank(message = "密码不能为空")private String password;然后,我们需要使用@Size注解来验证密码的长度是否在6到20之间:java@Size(min = 6, max = 20, message = "密码长度必须在6到20之间") private String password;最后,我们需要使用@Pattern注解来验证密码只能包含字母和数字:java@Pattern(regexp = "^[azAZ09]+", message = "密码只能包含字母和数字") private String password;根据之前的分析,我们知道基本约束注解应该放在组合约束注解之前,所以正确的顺序应该是@NotBlank、@Size、@Pattern。
java hibernate注解简单使用
前提:
这篇对hibernate的注解的一些参数的介绍的不是很不全(通常只是介绍例子中给出的注
解解析),要更完整的了解其中一个注解可以再继续查询这个注解。
这篇更多的是我自己学hibernate的总结,然后把注解列举一下,方便查找。
映射实体类例子
一般文件类DefaultFile
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) publicclass DefaultFile
{
// Fields
@Id
@Column(name = "id", insertable = false, updatable = false) @GeneratedValue(strategy=GenerationType.IDENTITY)
privateint id;
@Column(name = "name")
private String name;
@Column(name = "path")
private String path;
@Column(name = "note")
private String note;
@Column(name = "uploadDate", insertable = false, updatable = false)
private Timestamp uploadDate;
/**
* 文件内容,不被映射成column
*/
@Transient
File file;
...
}
图片文件类ImageFile
@Entity
@Table(name = "imageFile")
publicclass ImageFile extends DefaultFile
{
@OneToMany(cascade = CascadeType.ALL,mappedBy="imagefile", fetch = ZY)
private Set<Account> accounts = new HashSet<Account>();
...
}
账户类Account
@Entity
@Table(name="account")
publicclass Account {
// Fields
@Id
@Column(insertable=false,updatable=false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL) @JoinColumn(name="imageID")
//头像
private ImageFileimagefile;
@Column
private String name;
@Column
private String password;
@Column(insertable=false,updatable=false)
private Timestamp createdDate;
...
}
@Entity
作用:
标记为实体类,标记后都会被映射到数据表中
用法:
一般实体类都要加上这个注释
@MappedSuperclass
作用:
表明该类作为父类被其他实体类继承后,其它实体类可以继承该类的属性,并且结合各子类各自映射对应的表,然后改父类不映射到数据库表
用法:
这个和上面的@Entity可以说二者只能选其一,如果选择@MappedSuperclass则不映射表,如果用@Entity则会映射到表
结合例子:
例子中DefaultFile被注解为@MappedSuperclass,因此DefaultFile不会被映射到表,而ImageFile继承DefaultFile,因此ImageFile会继承DefaultFile的属性,加上自己的属性,映射到新表
@Inheritance
作用:
定义继承的策略
用法:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
上面的InheritanceType.TABLE_PER_CLASS是指每个子类都成为一个新表,还有以下的继承策略(看名字就大概知道意思了):
@Table
作用:
用来标记该实体类映射到数据库中的表的表名
用法:
可添加参数来说明表名@Table(name=”table_name”)
@Id
作用:
说明该属性为主键
@GeneratedValue
作用:
表明该列为自动增长的属性
用法:
@GeneratedValue(strategy=GenerationType.IDENTITY)
其中strategy指自动增长的策略,而这个GenerationType.IDENTITY是指数据库自动增长,相当于MySQL中auto_increment,还有其它属性:
@Column
作用:
指明该列的属性
用法:
@Column(name = “uploadDate”, insertable = false, updatable = false) name = “column_name”
指明列名
insertable=false
插入操作时忽略该属性
updatable=false
更新操作时忽略该属性
@OneToMany
作用:
表名一对多的关系,通常用于Set<T>变量
用法:
@OneToMany(cascade = CascadeType.ALL =
CascadeType.ALL,mappedBy=”imagefile”,fetch = ZY) cascade = CascadeType.ALL
在所有操作上都进行关联操作
mappedBy=”imagefile”
如果这个一对多的关系不是通过第三张表来维持,而是多方保存一方的id(多方外键引用一方),则必须要有mappedBy来指明多方中哪个变量来保存一方(外键),值是多方里面保存一方的属性名字,具体可看例子中的使用
fetch=FetchType.EAGER
加载的策略,有积极和懒惰,积极是指用查询语句获取对象时,马上加载标记为
@OneToMany的变量,懒惰则是等到使用时才获取。
@ManyToOne
作用:
表名一对多的关系,通常用在对应的一方类的一个变量
用法:
@ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
属性和@OneToMany的基本差不多。
但是如果这个多对一的关系不是通过第三张表来维持,而是保存在多方的表中(外键),必须还添加一个注解@joinColumn
@joinColumn
作用:
作用于@ManyToOne标注后的变量,指明该变量映射到数据库中表的列名
用法:
@JoinColumn(name=”imageID”)
值是数据库中外键的表名
@Transient
作用:
指明被标注的变量不需要被映射到数据库表中。