我有一个实体 A,它有一组基本类型(例如 String)。我使用这样的映射是因为与 A 的每个实例关联的字符串取决于 A 的生命周期。如果我想从数据库中删除 A 的实例,我还希望删除其关联的 String。
我的映射如下:
@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name", nullable = false, unique = true)
private String name;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "AStrings", joinColumns = @JoinColumn(name = "id"))
@Column(name = "strings", nullable = false)
private Set<String> strings;
}
如果我创建一个 A 的实例并向它添加一些字符串,那么我可以使用 Session.save(myInstance) 持久化该实例。 A 的实例及其关联的 String 都被持久化。
但是,如果我想从数据库中删除相同的实例,使用 Session.createQuery("delete A a where a.name = ?").setString(0, name).executeUpdate(),我得到一个外键约束错误:
Cannot delete or update a parent row: a foreign key constraint fails
但是,我希望在删除 A 的实例之前自动删除关联的 String,但事实并非如此。我也没有找到指定级联规则的方法。
我的配置有问题吗?
谢谢
编辑: 我也试过在字段 strings 上使用 @Cascade(CascadeType.DELETE),但它仍然没有帮助。通过查看数据库,我没有看到有关外键的任何 ON DELETE 策略。
有同样问题的人打开了一个 JIRA:https://hibernate.onjira.com/browse/HHH-4301 .必须存在解决方案(或解决方法),我不能是唯一使用 @ElementCollection 的人。
我已经解决了这个问题。我认为删除使用 Session.delete() 或使用 HQL 查询是等效的,但似乎不是。使用HQL查询,并没有自动删除依赖对象,所以出现外键约束错误。使用 Session.delete() 解决了这个问题。此外,Hibernate 似乎没有使用数据库的级联功能,因为我在生成的 DDL 中仍然没有看到任何 CASCADE 策略,它在内部处理这个问题。
最佳答案
我已经解决了这个问题。
我认为使用 Session.delete() 或使用 HQL 查询删除实体是等效的,但似乎不是。使用 HQL 查询,依赖对象不会自动删除,所以我得到了问题中解释的外键约束错误。
使用 Session.delete() 解决了这个问题。此外,Hibernate 似乎没有使用数据库的级联功能,因为我在生成的 DDL 中仍然没有看到任何 CASCADE 策略,它在内部处理这个问题。
对于版主:
我已经在过去添加了我对问题的回答(如您所问),但由于这是解决问题的答案并且没有发布(来自其他用户的)答案,我认为我应该将其发布在这里作为答案。
关于java - 可嵌入对象集合的级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12172971/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/