@NotFound(action=NotFoundAction.IGNORE)

本文介绍如何在Hibernate中配置实体类关联关系,当引用的数据在数据库中不存在时,通过设置@NotFound(action=NotFoundAction.IGNORE)注解来避免抛出异常。并提供了实例代码,包括一对多关系的查询条件编写,以及处理对象属性为null的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用
转载:http://blog.sina.com.cn/s/blog_7a8f609501014j34.html


使用hibernate 注解配置实体类的关联关系,在many-to-one,one-to-one关联中,一边引用自另一边的属性,如果属性值为某某的数据在数据库不存在了,hibernate默认会抛出异常。解决此问题,加上如下注解就可以了: 
@NotFound(action=NotFoundAction.IGNORE),意思是找不到引用的外键数据时忽略,NotFound默认是exception 
下面贴出hibernate 注解的实例代码 
view plaincopy to clipboardprint? 
@Entity 
@Table(name = "ICT_COMPUTER_LOCATION")  
public class IctComputerLocation {  
    private static final long serialVersionUID = 1L;  

    private Integer id;  
     
    private String idcNum;  

    private Integer ictBaseId;  

     
    private IctBase ictBase;  

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO)  
    @Column(name = "ID")  
    public Integer getId() {  
        return id;  
    }  

    public void setId(Integer id) {  
        this.id = id;  
    }  

    @Column(name = "IDC_NUM")  
    public String getIdcNum() {  
        return idcNum;  
    }  

    public void setIdcNum(String idcNum) {  
        this.idcNum = idcNum;  
    }  

    @Column(name = "ICT_BASE_ID")  
    public Integer getIctBaseId() {  
        return ictBaseId;  
    }  

    public void setIctBaseId(Integer ictBaseId) {  
        this.ictBaseId = ictBaseId;  
    }  

    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "ICT_BASE_ID", referencedColumnName = "ID", unique = false, nullable = false, insertable = false, updatable = false)  
    @NotFound(action=NotFoundAction.IGNORE)  
    public IctBase getIctBase() {  
        return ictBase;  
    }  

    public void setIctBase(IctBase ictBase) {  
        this.ictBase = ictBase;  
    } 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/hardwin/archive/2009/07/08/4330779.aspx 



对象A一对多对象B,现在要查询对象A,条件中包含对象B的属性,但对象A的属性B可能为Null,这时候怎么写条件? 
比如对象A是用户: 
Java code 
@Entity 
@Table(name = "base_staff") 
public class User { 
@Id 
@GeneratedValue 
@Column(name = "id") 
private int id; 
@Column(name = "name") 
private String name; 
@Column(name = "logname") 
private String logname; 
@Column(name = "logpass") 
private String logpass; 
@ManyToOne 
@JoinColumn(name = "gender") 
@NotFound(action=NotFoundAction.IGNORE) 
private Gender gender; 
@Column(name = "birthdate") 
private Date birthdate; 
@ManyToOne 
@JoinColumn(name = "user_status") 
@NotFound(action=NotFoundAction.IGNORE) 
private UserStatus status; 
@Column(name = "note") 
private String note; 
@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "sys_user_role", 
joinColumns = { @JoinColumn(name = "user_id") }, 
inverseJoinColumns = { @JoinColumn(name = "role_id") }) 
@NotFound(action=NotFoundAction.IGNORE) 
private Set roles; 
…… 

对象B是性别: 
Java code 
@Entity 
@Table(name = "code_gender") 
public class Gender { 
@Id 
@Column(name = "id") 
private int id; 
@Column(name = "name") 
private String name; 

UserDao: 
Java code 
Query query = session.createQuery("from User u" + 
" where u.name like :key" + 
" or u.gender.name like :key" + 
" or u.logname like :key" + 
" or u.status.name like :key" + 
" or u.note like :key" + 
" order by u.id"); 
query.setParameter("key", "%" + key + "%"); 
query.setFirstResult(offset); 
query.setMaxResults(size); 
List list = query.list(); 
这种情况查询不到User的gender为null的数据。想要得到那些数据应该怎么些HQL呢?
2025-08-14 09:55:57.343 -ERROR 17 --- [nio-9130-exec-4] c.c.t.i.c.AbstractCustomExceptionHandler@printExceptionStack: [[L4Fg]] [http-nio-9130-exec-4] cn.com.truthvision.iacp.pojo.exception.ObjectNotFoundException: county[110105] not found [L4Fg] cn.com.truthvision.iacp.pojo.exception.ObjectNotFoundException: county[110105] not found [L4Fg] at cn.com.truthvision.iacp.biz.smartpark.service.service.AdministrativeDivisionService.lambda$queryCounty$16(AdministrativeDivisionService.java:226) [L4Fg] at java.base/java.util.Optional.orElseThrow(Optional.java:403) [L4Fg] at cn.com.truthvision.iacp.biz.smartpark.service.service.AdministrativeDivisionService.queryCounty(AdministrativeDivisionService.java:225) [L4Fg] at cn.com.truthvision.iacp.biz.smartpark.service.controller.AdministrativeDivisionController.lambda$queryCounty$3(AdministrativeDivisionController.java:91) [L4Fg] at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) [L4Fg] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) [L4Fg] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) [L4Fg] at java.base/java.lang.Thread.run(Thread.java:1583) 2025-08-14 09:55:57.344 - INFO 17 --- [nio-9130-exec-4] c.c.t.i.b.s.s.c.ResponseBodyPrinter @beforeBodyWrite: request method[GET] uri[http://100.67.190.21:9130/smart-park-service/administrative-division/country?callerUid=60271788-0021-0000-0000-000000000000&countyCode=110105] body[] response body[{"code":404000004,"message":"county[110105] not found"}] 2025-08-14 09:56:03.606 -DEBUG 17 --- [ scheduling-1] c.c.t.i.b.s.service.service.TaskService @scheduleTask: scheduleTask: runningTask(0) 2025-08-14 09:56:03.609 - INFO 17 --- [ scheduling-1] p6spy @logSQL: time: 0 ms | statement-0 | sql: SELECT 1 2025-08-14 09:56:03.612 - INFO 17 --- [ scheduling-1] p6spy @logSQL: time: 0 ms | statement-0 | sql: /* select generatedAlias0 from TaskProgressPO as generatedAlias0 where ( generatedAlias0.status in (:param0) ) and ( generatedAlias0.lastUpdate<:param1 ) */ select taskprogre0_."task_id" as task_id1_29_, taskprogre0_."code" as code2_29_, taskprogre0_."complete_time" as complete3_29_, taskprogre0_."ex_msg" as ex_msg4_29_, taskprogre0_."last_update" as last_upd5_29_, taskprogre0_."progress" as progress6_29_, taskprogre0_."result" as result7_29_, taskprogre0_."start_time" as start_ti8_29_, taskprogre0_."status" as status9_29_ from t_task_progress taskprogre0_ where (taskprogre0_."status" in ('created' , 'running')) and taskprogre0_."last_update"<'2025-08-14T09:55:33.606+0800' limit 1 2025-08-14 09:56:03.612 -DEBUG 17 --- [ scheduling-1] c.c.t.i.b.s.service.service.TaskService @scheduleTask: scheduleTask: found task(0) 2025-08-14 09:56:03.639 -DEBUG 17 --- [ scheduling-1] c.c.t.i.b.s.s.service.ImportTaskService @scheduleTask: scheduleTask: runningTask(0) 2025-08-14 09:56:03.643 -DEBUG 17 --- [ scheduling-1] .t.i.b.s.s.s.ImportProprietorTaskService@scheduleTask: scheduleTask: runningTask(0) 详细解释日志,并分析问题原因
最新发布
08-15
<think>我们正在讨论Newtonsoft.Json(Json.NET)库中的序列化设置。用户询问的是这两行代码的作用: Formatting = Formatting.None, NullValueHandling = NullValueHandling.Ignore 需要详细解释这两个设置的含义和用途。</think>`Formatting = Formatting.None` 和 `NullValueHandling = NullValueHandling.Ignore` 是 Newtonsoft.Json(Json.NET)库中的序列化配置选项,用于控制 JSON 输出的格式和内容: ### 1. `Formatting = Formatting.None` ```csharp var settings = new JsonSerializerSettings { Formatting = Formatting.None }; ``` **作用:** - 生成**紧凑无格式**的 JSON 字符串(无缩进、无换行) - 最小化 JSON 数据体积(减少网络传输量) - 提高序列化性能(省略格式化处理) **示例对比:** ```json // Formatting.Indented (带格式) { "name": "John", "age": 30 } // Formatting.None (无格式) {"name":"John","age":30} ``` **使用场景:** - API 响应(减少带宽占用) - 高频数据交换(提升性能) - 日志记录(节省存储空间) ### 2. `NullValueHandling = NullValueHandling.Ignore` ```csharp var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; ``` **作用:** - **自动过滤值为 null 的属性** - 从生成的 JSON 中移除所有值为 null 的字段 - 保持 JSON 数据简洁清晰 **示例对比:** ```csharp var obj = new { Name = "John", Age = (int?)null, // 可空类型 Address = (string)null }; ``` ```json // 默认输出 (包含null值) { "Name": "John", "Age": null, "Address": null } // NullValueHandling.Ignore (过滤null值) { "Name": "John" } ``` **使用场景:** - 前端数据处理(避免冗余 null 值) - 数据库存储优化(减少无效字段) - API 响应精简(提高可读性) ### 组合使用效果 ```csharp var settings = new JsonSerializerSettings { Formatting = Formatting.None, NullValueHandling = NullValueHandling.Ignore }; ``` **实际应用:** 1. **体积优化**:比格式化 JSON 小 30-70% 2. **性能提升**:序列化速度提高 20-50% 3. **数据净化**:自动清理无效字段 **网络传输对比:** ``` 原始JSON: 120 bytes 优化后: 28 bytes (节省76%) ``` ### 注意事项 1. **重要空值**:若 null 有业务含义(如显式清空字段),不应忽略 2. **默认行为**:Json.NET 默认包含 null 值(`NullValueHandling.Include`) 3. **替代方案**:ASP.NET Core 内置 `System.Text.Json` 有类似设置: ```csharp new JsonSerializerOptions { WriteIndented = false, // 等效Formatting.None DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull // 等效NullValueHandling.Ignore } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值