实体类间映射关系

转自:https://www.zybuluo.com/zhuanxu/note/1000527

JPA @OneToOne@ManyToOne@OneToMany@ManyToMany几个注解提供用以定义实体类之间的关系。

OneToOne关系

OneToOne 表示一对一的关系,先来看 OneToOne 的属性:

@OneToOne

  • targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类,绝大数据情况下不需要进行设置。

  • cascade属性表示级联操作策略:

    1. 不定义, 则对关系表不会产生任何影响
    2. CascadeType.PERSIST: 级联新建
    3. CascadeType.REMOVE: 级联删除
    4. CascadeType.REFRESH: 级联刷新,即重新同步到数据库中状态,会覆盖掉已经修改但是还没保存的实体类属性
    5. CascadeType.MERGE: 级联更新
    6. CascadeType.ALL: 表示选择全部四项
  • fetch属性表示实体的加载方式,有LAZY和EAGER两种取值,默认值为EAGER
  • optional属性表示关联的实体是否能够存在null值,默认为true,表示可以存在null值

关于fetch属性,所有@XXXToOne,默认值为EAGER,所有@XXXToMany,默认值为LAZY。

@JoinColumn

OneToOne 注释属性自动映射的字段名按照如下方式命名:

关联表的名称 + "_" + 关联表主键的字段名

如果对应的字段名是其他名字,则可以通过@JoinColumn来定义外键关联的字段名称。

  • name:表示字段名
  • referencedColumnName: 使用的外键名
  • unique:是否设置为唯一key

双向 @OneToOne 关联

通过属性mappedBy标明,设置了mappedBy属性的关系标注(各种@XXXToXX),表明当前类是关系的被维护方,而另外一个类则是关系维护方,你可以这样理解:

  • 关系维护方对应的是定义外键约束的数据库表
  • 关系被维护方对应于外键所在的数据库表

最后需要注意的一个问题是,关系维护方才能够操作两者的关系。

看两段代码: 
 

  • 对于操作 1:由于cascade级联操作,将会向Customer和 Portrait 表插入数据,但是不会设置两者之间的关系,即Portrait表的 customer_id 字段值为空,因为Customer类是关系被维护方
  • 对于操作 2:由于cascade级联操作,两个表都会插入数据,而且 customer_id 的值得到正确设置

ManyToOne关系

@ManyToOne的属性选项与@OneToOne是类似的:

  • targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类。
  • cascade属性表示级联操作策略: 
    1. 不定义, 则对关系表不会产生任何影响
    2. CascadeType.PERSIST: 级联新建
    3. CascadeType.REMOVE: 级联删除
    4. CascadeType.REFRESH: 级联刷新
    5. CascadeType.MERGE: 级联更新
    6. CascadeType.ALL: 表示选择全部四项
  • fetch属性表示实体的加载方式,有LAZY和EAGER两种取值。
  • optional属性表示关联的实体是否能够存在null值,默认为true,表示可以存在null值。如果为false,则要同时配合使用@JoinColumn标注。

ManyToMany关系

直接上代码示例,不多讲。 

自定义查询

Spring Data 内建的查询构造机制可能是最有特色的一个地方。 
一个例子: 

所有支持的有: 
 

更多的spring-data相关的可以在spring-data 官方文档查看。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C#中将实体类映射到SQLite数据库,可以使用ORM(对象关系映射)框架,比如EF Core和Dapper等。以下是使用EF Core的一个简单示例: 1. 首先,需要安装EF Core和SQLite包。可以使用NuGet包管理器或手动下载并添加到项目中。 2. 创建SQLite数据库文件并打开它。可以使用SQLite Studio或其他SQLite客户端。 3. 创建一个实体类,例如: ```csharp public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } ``` 4. 创建DbContext类,指定连接字符串和实体类: ```csharp using Microsoft.EntityFrameworkCore; public class MyDbContext : DbContext { public DbSet<Person> People { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=database.db"); } } ``` 5. 在C#代码中,使用DbContext连接到SQLite数据库,并将实体类映射到数据库表。以下是一个示例代码: ```csharp using System.Linq; //连接到SQLite数据库 using (var db = new MyDbContext()) { //创建Person表 db.Database.EnsureCreated(); //插入新记录 var person = new Person { Name = "John Doe", Age = 30 }; db.People.Add(person); db.SaveChanges(); //查询记录 var people = db.People.ToList(); //输出结果 foreach (var p in people) { Console.WriteLine($"Id: {p.Id}, Name: {p.Name}, Age: {p.Age}"); } } ``` 这样,就可以将实体类映射到SQLite数据库中,可以方便地进行CRUD操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值