hibernate注解之@Onetomany、@Manytoone、@JoinColumn

本文深入解析了Hibernate框架中实体类与数据库表映射的@Onetomany和@Manytoone注解,详细阐述了其参数配置及在项目启动后的表生成情况。

 

@Onetomany用于实体类与数据库表映射中少的一方,请看下面的例子。

假设一个用户只有一种角色,用户和角色是onetomany的关系

用户实体

复制代码
@Entity
@Table(name="user")
public class UserEntity implements Serializable{
    
    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="userName")
    private String userName;
    @Column(name="password")
    private String password;
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date createDate;
  ......
复制代码

角色实体

复制代码
@Entity
@Table(name="role")
public class RoleEntity implements Serializable{

    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="name")
    private String name;
    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
    private Set<UserEntity> user;
复制代码

同时设置配置文件为<prop key="hibernate.hbm2ddl.auto">update</prop>

那么在项目启动后会自动生成三张表,分别是

角色表

用户表

角色用户表

@Onetomany 的参数:

mappedBy:用于双向关联时使用,否则会引起数据不一致的问题。

fetch:可取的值有FetchType.EAGER和FetchType.LAZY,前者表示主类被加载时加载,后者表示被访问时才会加载

cascade:CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)、CascadeType.ALL(选择全部)

@Manytoone

用于多对一,请看下例,

用户实体类

复制代码
@Entity
@Table(name="user")
public class UserEntity implements Serializable{
    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="userName")
    private String userName;
    @Column(name="password")
    private String password;
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date createDate;
    @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY,optional=true)
    @JoinColumn(name="roleid",nullable=true)
    private RoleEntity role;
复制代码

 

这样在项目启动后只有两种表

role表

 

 user表

@Manytoone的参数:optional 属性是定义该关联类对是否必须存在,值为false时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为null。 值为true 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。 optional 属性的默认值是true。

其它属性与onetomany相同。

@JoinColumn

与@Column用法相同,区别是@JoinColumn作用的属性必须是实体类

转载于:https://www.cnblogs.com/Bkxk/p/9957191.html

<think>好的,用户想了解JPA或Hibernate@OneToMany注解的使用方法和依赖配置。我之前回答过类似的问题,但需要结合提供的引用内容来组织答案。首先,引用[1]提到@OneToMany用于一对多关系,并且涉及@JoinColumn作为关系维护字段。引用[2]则展示了User实体中使用@OneToMany的例子,包括cascade、fetch和orphanRemoval参数,以及生成的SQL语句。 用户可能需要知道如何正确配置@OneToMany,包括关联的注解和参数设置。需要区分单向和双向关联,因为这在配置上有不同。比如,单向关联通常需要在“一”的一方使用@JoinColumn,而双向关联需要在“多”的一方使用@ManyToOne@JoinColumn,并在“一”的一方设置mappedBy。 还要注意级联操作和孤儿删除的设置,这些影响数据持久化的行为。比如,orphanRemoval=true会在父实体删除时自动删除子实体。此外,延迟加载(FetchType.LAZY)对性能的影响也很重要,需要提及。 需要确保示例代码正确,符合JPA规范,比如在双向关联中正确使用mappedBy,避免循环引用。同时,可能出现的常见问题,如N+1查询问题,可以通过FetchMode.SUBSELECT来优化,如引用[2]中的例子。 最后,生成相关问题时要覆盖常见的配置问题、性能优化和实际应用场景,帮助用户进一步学习。</think>### JPA/Hibernate@OneToMany注解使用详解 在JPA中,@OneToMany用于建立一对多关系,需要结合@JoinColumn或mappedBy进行配置,具体分为两种模式: #### 一、单向关联(仅一方维护关系) ```java //用户实体(一方) @Entity public class User { @Id @GeneratedValue private Long id; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "user_id") //指定外键字段 private List<ContactInfo> contactInfos = new ArrayList<>(); } //联系方式实体(多方) @Entity public class ContactInfo { @Id @GeneratedValue private Long id; private String phone; } ``` **关键配置**: 1. `cascade = CascadeType.ALL`:级联所有操作[^1] 2. `orphanRemoval = true`:自动删除无关联的子实体[^2] 3. `@JoinColumn`指定外键字段名 #### 二、双向关联(双方维护关系) ```java //用户实体(一方) @Entity public class User { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<ContactInfo> contactInfos = new ArrayList<>(); } //联系方式实体(多方) @Entity public class ContactInfo { @Id @GeneratedValue private Long id; @ManyToOne @JoinColumn(name = "user_id") private User user; } ``` **关键差异**: - `mappedBy`表示关系由多方维护 - 必须实现关联同步方法: ```java //在User实体中添加 public void addContact(ContactInfo info) { contactInfos.add(info); info.setUser(this); } ``` ### 参数说明表 | 参数 | 说明 | 示例值 | |------|------|--------| | cascade | 级联操作类型 | CascadeType.PERSIST | | fetch | 加载策略 | FetchType.LAZY | | orphanRemoval | 孤儿记录处理 | true | | mappedBy | 关系维护方指定 | "user" | ### 最佳实践建议 1. 优先使用双向关联,避免多余的外键更新操作 2. 建议始终设置`orphanRemoval=true`保持数据一致性[^2] 3. 使用LAZY加载策略预防N+1查询问题 4. 通过`@Fetch(FetchMode.SUBSELECT)`优化集合加载[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值