我有一张儿童桌。在创建表时使用 ON DELETE CASCADE 和外键。
子表或父表中都没有记录。
我希望主键和外键保持原样,但只想从子表中删除 CASCADING 选项。
无论如何我可以改变那个子表。
谢谢你。
在oracle中,我可以发出DROP TABLE ...级联约束,它不会抱怨FK等.
在T-SQL中是否有等价物?
在Hibernate参考书的第21章中,我有一个基本的一对多关系父/子.
级联仅从子级到父级(持久化级联仅因为我不想删除父项,如果我删除子级).
当我向父母添加一个孩子并保存孩子时,我有一个TransientObjectException ...
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> childs;
public List<Child> getChilds() {
return childs;
}
public void setChilds(List<Child> childs) {
this.childs = childs;
}
public void addChild(Child child) {
if (childs == null) childs = new ArrayList<Child>();
if (childs.add(child)) child.setParent(this);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@Entity
public class …Run Code Online (Sandbox Code Playgroud) HasMany使用无状态会话批量插入包含其他实体集合(映射)的实体的正确方法是什么?
例如父类映射如下:
class ParentMap : ClassMap<Parent>
{
public ParentMap()
{
Id(x => x.Id)
.GeneratedBy.Increment();
HasMany(x => x.ChildNodes)
.KeyColumns.Add("Parent_id")
.Cascade.All();
}
}
Run Code Online (Sandbox Code Playgroud)
无状态会话忽略级联选项,因此子节点不会自动保留.我可以自己遍历集合,但后来我无法设置关系,因为Parent_id列不存在作为我可以写入的属性.
我错过了什么吗?
我基于这个答案实现了双向1:1关系:
我这样定义双向关系:
public class Student
{
public virtual int StudentId { get; set; }
public virtual Anamnesis Anamnesis { get; set; }
. . .
}
public class Anamnesis
{
[Key, ForeignKey("Student")]
public int AnamnesisId { get; set; }
public virtual Student Student { get; set; }
. . .
}
Run Code Online (Sandbox Code Playgroud)
其中,学生是主要实体,Anamnesis是共享PK的实体.
现在我想创建的关系有一个Delete Rule = CASCADE.实际上,正在创建的关系具有Delete Rule = NO ACTION,如下图所示:

如果我在"表格属性"窗口中手动删除此关系并使用"删除规则"="CASCADE"添加其他关系,则代码将按照我的预期允许我删除学生并且它具有相同ID的共享Anamnesis.
所以,这是我的问题:
有没有办法在我的类中使用Data Annotation(不是Fluent API),以便获得与CASCADE删除规则的关系?我更喜欢使用Data Annotation但是如果不可能的话,我会对使用它的一些Fluent API代码感到满意.
注意
我已经尝试了这篇文章中显示的Fluent API代码.它在我有双向属性的情况下不起作用.
cascade sql-server-ce cascading-deletes ef-code-first entity-framework-4.1
在过去的几周里,我一直在项目中使用NHibernate(使用Fluent-NHibernate映射),直到今天我遇到了一个问题(很可能是我自己的错误).
我做了一个小样本来说明我想要实现的目标:
public class Image
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Path { get; set; }
}
public class FeaturedImage
{
public virtual int Id { get; set; }
public virtual Image Image { get; set; }
public virtual string Description { get; set; }
public virtual DateTime Date { get; set; }
}
public class ImageMap : ClassMap<Image>
{
public ImageMap()
{
Id(x => x.Id).GeneratedBy.Identity().UnsavedValue(0); …Run Code Online (Sandbox Code Playgroud) 我在表中有两个外键.我们假设该表被调用News并具有外键,updatedById并且createdById两者都指向userId表中Users.
现在我想在NULL删除用户时设置外键,但是当我尝试设置ON DELETE SET NULL该关系时,我得到:
在表'新闻'上引入FOREIGN KEY约束'FK_News_Users'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.
我不明白为什么两个外键都不能设置为null?
@Entity
@Table(name = "Section_INST")
public class Section {
@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "Section_ID_GENERATOR")
@SequenceGenerator(name = "Section_ID_GENERATOR",sequenceName = "Section_ID_SEQUENCER" , initialValue = 1 , allocationSize = 1)
@Column(name = "Section_ID")
private int Id;
@Column(name = "Section_Name")
private String name;
@OneToOne(optional = false,cascade = CascadeType.PERSIST)
@JoinColumn(name = "Exch_ID")
private Exchange exchange;
//---Constructor and Getter Setters-----
}
@Entity
@Table(name = "EXCHANGE_INST")
public class Exchange {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "Exchange_ID_GENERATOR")
@SequenceGenerator(name = "Exchange_ID_GENERATOR",sequenceName = "Exchange_ID_SEQUENCER" , initialValue = 1 , allocationSize …Run Code Online (Sandbox Code Playgroud) Time &Time::setHour( int h )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
return *this;
}
Time &Time::setMinute( int m )
{
minute = ( m >= 0 && m < 60 ) ? m : 0;
return *this;
}
Time &Time::setSecond( int s )
{
second = ( s >= 0 && s < 60 ) ? s : 0;
return *this;
}
int main()
{
Time t;
t.setHour( 18 ).setMinute( …Run Code Online (Sandbox Code Playgroud) 出于某种原因,当我尝试删除包含 elementcollection 的父元素时,我的删除不是级联的,这两个类如下:
@Entity
@Table(name="Timestamps")
@JsonIgnoreProperties(ignoreUnknown = true)
public class ProductList {
private boolean success;
@Id
private Date lastUpdated;
private String time = "minute";
@ElementCollection
@MapKeyColumn(name="product_id")
@CollectionTable(name="Products")
private Map<String,Product> products;
Run Code Online (Sandbox Code Playgroud)
和:
@Embeddable
@JsonIgnoreProperties(ignoreUnknown = true)
public class Product{
@Embedded
private Status quick_status;
Run Code Online (Sandbox Code Playgroud)
目前这是我在班级中唯一的字段,因为我已经删除了所有其他字段,试图找出为什么当我尝试删除父对象时删除不会级联到 Products 表。以下是我正在运行的查询:
DELETE FROM Timestamps list WHERE list.last_updated !=0;
Run Code Online (Sandbox Code Playgroud)
last_updated 值将始终为非零,因此我只是使用此查询来测试删除,但即使我在 mysql shell 中运行查询时,我也会收到“无法删除或更新父行:外键约束失败”我认为 elementcollection 注释应该自动级联,有什么我遗漏的吗?
编辑,当下面是 Hibernate 发送的 sql 命令时,你会注意到第三个它缺少级联。
Hibernate: create table products (product_list_last_updated datetime(6) not null, buy_price float not null, sell_price float not null, …Run Code Online (Sandbox Code Playgroud) cascade ×10
constraints ×2
hibernate ×2
nhibernate ×2
t-sql ×2
alter ×1
c# ×1
c++ ×1
foreign-keys ×1
java ×1
mysql ×1
one-to-many ×1
orphan ×1
pointers ×1
spring ×1
spring-boot ×1
sql ×1
sql-server ×1
this ×1