草庐IT

java - 如果外键引用空行而键不可为空,如何不崩溃?

coder 2023-10-22 原文

我有这张表“区域”:

编号 |姓名 | parent_id

1 |随便| 100000

其中 parent_id 应该是对 id 的自引用,这意味着该行在地理上属于 100000。

但是由于一开始导入的数据是脏的,所以id为100000的行不存在。

因此在给定的实体中:

@Entity("regions")
public class Region {
    private int id;
    private String name;
    private Region parent;

    ...

    @ManyToOne()
    @JoinColumn(name = "parent_id")
    public Region getParent() {
        return parent;
    }

    public void setParent(Region parent) {
        this.parent = parent;
    }
}

当我用 hibernate 做一个列表时:

    Session session = sessionHandler.getSession(); //gets current session
    Transaction tx = session.beginTransaction();
    try {
        return (List<T>)session.createQuery("FROM regions").list();
    }
    catch(HibernateException ex) {
        ex.printStackTrace();
        if (tx!=null) tx.rollback();
        throw ex;
    }finally {
        sessionHandler.close(); 
    }

它会抛出异常:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [whatever.entities.Region#6046193]

表示 id 6046193 的区域不存在。如前所述,我预计会发生这样的事情。

我的问题是,鉴于我无法将 parent_id 列编辑为可为空,是否有一种方法可以处理此异常,以便系统忽略该异常并让程序继续运行?

最佳答案

您可以尝试将多对一关系的获取类型设置为惰性。

...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
public Region getParent() {
    return parent;
}
...

我想 hibernate 不会在“全选”过程中抛出错误,如果你这样做的话,你可以在第一次调用 getter 时处理错误。

但我不能 100% 确定这是否有效,而且我认为这不是一个很好的解决方案。我真的认为您应该在导入期间/之后清理您的数据。

如果您不清理数据,则必须永远保留代码中问题的解决方法。如果将来有人删除了 fetch = FetchType.LAZY,因为他们认为这会带来更好的性能怎么办?您的应用程序将以意想不到的方式中断,只是因为您的实体没有正确反射(reflect)数据库中的内容。

您说您不能将 parent_id 设置为 null,因为该列不可为 null。但是如何为丢失的 ID 创建虚拟条目呢?您可以在导入脏数据后、首次启动应用程序之前立即执行此操作。

此外,仅将列更改为可为空(假设您暂时可以这样做)无论如何都行不通。您仍然需要清理数据 - 在这种情况下,当具有引用 ID 的行不存在时,您必须将所有 parent_id 设置为 null。

关于java - 如果外键引用空行而键不可为空,如何不崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34625903/

有关java - 如果外键引用空行而键不可为空,如何不崩溃?的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  7. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  8. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐