Hibernate 试图在保留父数据的同时删除/更新子元素
我在一个链中有3个表,顶部是一个“走廊”Hibernate 试图在保留父数据的同时删除/更新子元素,hibernate,jpa,spring-data-jpa,many-to-many,sql-delete,Hibernate,Jpa,Spring Data Jpa,Many To Many,Sql Delete,我在一个链中有3个表,顶部是一个“走廊”@Entity,底部是段
@Entity
,底部是段
,中间是通过@JoinTable
创建的,另外两个表中的id列之间有多个
关系。这一项被称为CorridorSegments
我正在试图找到一种方法来保存道路数据,并删除数据库中与道路
行相关的所有段
行和道路
段
行。然后我打算替换它们。因此,这几乎是一个更新过程,将原始数据保留在顶部的“走廊”表中,并将其链接到新条目
@Entity
@Table(name = "corridor")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "corridor")
public class Corridor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "text_identifier", nullable = false)
private String textIdentifier;
@ManyToOne
private Jurisdiction jurisdiction;
//etc., etc., getters, setters, constructors, basic Entity class
}
@ManyToMany(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
@缓存(用法=缓存并发策略。非严格读写)
@可接合(name=“道路\ U段”,
joinColumns=@JoinColumn(name=“roadway\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“segment\u id”,referencedColumnName=“id”))
私有集段=新HashSet();
我可以使用一个简单的segmentRepository.save(segment),通过扩展JPARepository接口的我的repository类将新条目保存到segments表中代码>但是当我尝试使用内置的段存储库.delete()时代码>,它不工作
我认为这可能是因为我需要在删除工作之前分离关系,或者更改中间表的结构,但我不确定
关于如何删除表中的数据并替换它们,有什么建议吗?谢谢你的帮助 加载要删除其所有段
条目的道路
从它迭代引用的段
实例。
对于每个on,您需要将其从其所在的所有道路
实例中删除。
因此,它不再被引用。
然后,您可以使用segmentrepository
上的delete
操作将其删除。我想您可能可以将段设置为空列表并保存,然后将段设置为无论您想如何保存。请修复代码段,好吗?当前这两个类永不结束,segment
似乎包含一个自我引用,与文本中的描述不符。感谢您的回复。我尝试加载它,然后从走廊中删除所有线段。调试器在加载的道路对象中显示了0条线段。然后我在存储库中进行了删除,但当我检查时,一切都是一样的。我猜发生这种情况的唯一原因是数据库中仍然存在对对象的开放引用?我还尝试了上面的建议,我用一个空列表重写了道路对象,然后对segmentRepository执行了保存操作,但也没有更改。听起来您的更改没有刷新和提交。确保上述所有操作都在事务中进行,并且检查在事务之后进行。你说得对!这就是我们一直缺少的东西。清除这些片段后进行冲洗就成功了。谢谢你的帮助
@Entity
@Table(name = "segment")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Segment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "sequence", nullable = false)
private Long sequence;
@NotNull
@Column(name = "name", nullable = false)
private String name;
//etc., etc., getters, setters, constructors, basic Entity class
}
@ManyToMany(cascade = {CascadeType.ALL}, fetch=FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JoinTable(name = "corridor_segments",
joinColumns = @JoinColumn(name="corridor_id", referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name="segment_id", referencedColumnName="id"))
private Set<Segment> segments = new HashSet<>();