需求:
1.有一个User类,有如下属性:
String username; //PK
String password;
Set grantedAuthority; //一对多关联到Authorities
2.有一个Authorities,有如下属性:
String username; //主键1
String authority; //主键2
要实现如注释所示的表关系。
做法:
一。联合主键的制作
网上有三种方法,我用的是@IdClass标签的方法。
需要为联合主键多做一个类AuthoritiesPK(
需要实现Serializable接口)来实现主键的联合,其中属性只需要有联合主键的字段就行了,并且为它们实现get和set方法,这个类
不需要做任何的annotation标记。
另一个Authorities类在@Entity标记下面添加一个@IdClass(AuthoritiesPK.class),
括号里面的是前面那个新建的类。然后再在Authorities类中的主键的get方法前添加@Id标签就可以了。
*别忘了mapping文件,只要对User和Authorities两个类做映射就行了,不用做那个AuthoritiesPK的。
二。一对多关联
我原先的设置是这样的,这是个
错误的配置。
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(name="authorities",
joinColumns=@JoinColumn(name="username"))
public Set getGrantedAuthorities() {
return grantedAuthorities;
}
这样配置最后在生成表的时候,User和Authorities关联会多出来两个列"grantedAuthorities_username"和"grantedAuthorities_password"并且在使用过程中会出错。
正确的配置如下:
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name="username")
public Set getGrantedAuthorities() {
return grantedAuthorities;
}
这样Authorities表中的username属性就被正确的和User表中的username关联起来的。
*重要的提示!
顺带一提的事这个JoinColumn的意义是从表(Authority)中的这个字段(username)和主表(User)的主键(username这个不是配置里面的那个username要注意哦!)相互关联。
分享到:
相关推荐
本文将深入探讨如何结合 Spring 的注解配置与 Hibernate 实现数据持久化,通过一个实际的 demo 示例来阐述整个过程。 首先,Spring 框架以其依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented ...
在示例中,我们有一个`UserRolePK`类,用于表示用户角色关联的复合主键。这个类需要实现`Serializable`接口,因为所有主键都必须是可序列化的,以便于JPA处理。此外,为了确保两个`UserRolePK`对象是否相等,我们...
本文将深入探讨"注释版本的Hibernate",结合具体实例,帮助读者理解如何使用注解来实现对象关系映射(ORM)。 一、Hibernate概述 Hibernate是一个开源的对象关系映射框架,它允许开发者用面向对象的方式处理数据库...
6. **@ManyToOne, @OneToMany, @OneToOne, @ManyToMany**: 这些注解用于定义对象间的关联关系,例如一对一、一对多、多对一和多对多。 7. **@JoinColumn**: 在关联关系中,用于指定外键所在的列。 8. **@Temporal*...
- **@OneToMany**:用于配置一对多关联关系。配合`@Cascade`注解可以自动级联执行CRUD操作,如`Cascade.ALL`表示所有CRUD操作都将被级联执行。 示例代码: ```java @OneToMany(targetEntity=Attachment.class) @...
在多对一和一对多的关联关系中,实体类注释提供了更为简洁的配置方式。如`Employee.java`中的`@ManyToOne`注解,它指明了`Employee`与`Department`之间的一对多关系,通过`@JoinColumn(name = "deptid")`指定了外键...
这篇博客“使用annotation获取实体类注释”主要探讨了如何利用注解来增强代码的可读性和可维护性,同时介绍了如何从实体类中获取已定义的注解信息。以下是关于这个主题的一些关键知识点: 1. **注解定义**:注解以`...
2. **Hibernate Xdoclet注释**:文章会详细介绍Hibernate支持的Xdoclet注释,如`@Entity`、`@Table`、`@Id`、`@Column`等,这些注释用来指定实体类、表名、主键和字段映射。通过在Java类和属性上添加这些注释,...
- **示例一**:使用注解记录需求改进的信息。 ```java /** * DescribestheRequest-For-Enhancement(RFE)thatled * tothepresenceoftheannotatedAPIelement. */ public @interface RequestForEnhancement { ...
复合主键是指使用多个属性变量(表中的多列)联合起来作为主键。为了实现复合主键,需要编写一个复合主键类(CompositePrimaryKeyClass),并遵循以下规则: - **复合主键类要求**: - 必须实现`Serializable`接口...
4. **关系映射注解**:Hibernate支持一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)的关系映射。比如,一个用户可以有多个订单,可以这样表示: ```java @OneToMany...
- **`persistence-unit`节点**:可以定义一个或多个,每个`persistence-unit`节点定义了持久化内容名称、使用的数据源名称及Hibernate属性。 - **`name`属性**:设置持久化单元的名称。 - **`jta-data-source`**:...
Java注释处理器客户端是Java开发中的一个重要工具,它在编译期间通过读取源代码中的特定注解(Annotation)来生成或修改其他源代码、资源文件或者元数据。这个工具通常用于实现元编程,帮助开发者编写更加简洁且具有...
在这个“注解解析demo”中,我们可以看到一个关于如何创建和使用自定义Java注解的示例。首先,我们需要理解Java注解的三个核心概念:注解类型(Annotation Type)、注解实例(Annotation Instance)和注解处理器...
注释处理器是Java编译器的一部分,它们可以在编译期间对源代码进行分析和修改,通常用于自动生成额外的源代码或者元数据。 【描述】进一步强调了这个API的功能,即它专为在内存中编辑Java代码而设计,这意味着...
- 对Kotlin Coroutines的集成,使得Spring应用能够轻松实现非阻塞和异步操作。 总结,Spring框架5.3.9版本的官方文档提供了丰富的学习资源,无论是核心的容器管理,还是面向切面编程,再到数据访问和Web开发,都有...
Spring MVC 提供了一个灵活的架构,允许开发者选择他们喜欢的技术来实现视图层(如 JSP、Thymeleaf 或 FreeMarker),数据绑定和验证(如 Hibernate 或 JPA),以及处理请求(如拦截器和过滤器)。它还支持注解驱动...