我有两个对象,Parent 和 Child。 Child 有一个外键返回到 PARENT 表(MySQL 数据库)中的 PARENT_ID 字段。
当同时创建/组装父对象和子对象并调用持久化时,不会自动填充子对象的 PARENT_ID 外键。
示例代码:
@Entity
@Table(name = "PARENT")
public class Parent {
@Column(name = "PARENT_ID")
private Long parentId;
@OneToMany(mappedBy = "parent")
private List<Child> children;
}
@Entity
@Table(name = "CHILD")
public class Child {
@Column(name = "CHILD_ID")
private Long childId;
@Column(name = "PARENT_ID")
private Long parentId;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}
我有两个持久性示例:
1) 使用 Hibernate EntityManager:
@PersistenceContext
EntityManager em;
...
em.persist(parent);
2) 使用 Spring Data JPA JpaRepository 实例:
public interface ParentRepository extends JpaRepository<Parent, Long> {
}
在我的 ParentServiceImpl 中:
@Autowired
private ParentRepository parentRepository;
...
public Parent save(Parent parent) {
return parentRepository.save(parent);
}
填充外键的推荐策略是什么?是否应该先持久化 Parent 对象,然后再持久化 Child 对象外键?或者有没有一种方法可以通过自动或通过引用设置外键来同时保留所有内容?
编辑:添加持久性示例。
编辑 2(已修复!):问题已根据 Ryan Stewart 的第二点解决。我从 Child 对象中删除了 Long parentId 字段,并将 parentId 的 @Column 引用放在 getter 上。还要确保正确设置引用(重要的是子引用回到父)。
最佳答案
该代码有两件事阻止它工作:
@Id。您可能只是忽略了它,因为这是一个示例,但值得指出。parent_id。 Child 有一个 Long 字段和一个 Parent 字段映射到同一列。摆脱龙。这是您所追求的父子关系。在那之后,你所拥有的是一个完全传统的双向一对多,带有一个连接列。如果它不适合你,那么你在创建和保存它们的代码中做错了。很可能,您没有正确创建对象。使用这些实体的正确代码如下所示:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Parent p = new Parent();
Child child = new Child();
child.parent = p;
Child child1 = new Child();
child1.parent = p;
p.children = Arrays.asList(child, child1);
session.save(p);
session.save(p.children.get(0));
session.save(p.children.get(1));
tx.commit();
特别注意,子应该设置在父中,父也应该设置在子中。不要构建半损坏的对象模型并期望 Hibernate 来清理您的烂摊子。许多人忽略了这个看似显而易见的要求,并想知道为什么 Hibernate 看起来不稳定和/或不可靠。
关于mysql - 当同时保留父/子对象时,如何在 Hibernate + Spring JPA 配置中填充外键值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10769865/
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R