【问题标题】:Hibernate: I don't want delete child休眠:我不想删除孩子
【发布时间】:2014-12-21 14:11:57
【问题描述】:

我是意大利人,我为我的英语道歉。

我有两个 POJO 类,它们在我的 Db 中表示父表和子表。

父母。 Persona.java

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name = "nome", length = 30, nullable = false)   
private String nome;

@Column(name = "cognome", length = 30, nullable = false)
private String cognome;

@Column(name = "eta")
private int eta;

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH}, mappedBy = "persona", orphanRemoval = false)
@Column(nullable = true)
private List<Telefono> numeriDiTelefono;

// Others getters and setters

孩子。 Telefono.java

@Id
@Column(name = "numero_telefono")
private String numeroDiTelefono;

@Column(name = "tipo")
private String tipo;


@ManyToOne(cascade = {CascadeType.REMOVE, CascadeType.PERSIST })
@JoinColumn(name = "persona_id", nullable = true)
private Persona persona;

// Others getters and setters

我已经使用注释来映射数据库中的这些类。

当我尝试从数据库中删除 Persona 时,休眠删除与该 Persona 关联的 Telefono,我不想要它。 我希望子引用在 Telefono 表中的 persona_id 字段中具有空值,如何获得该结果?我应该使用哪些注释? 谢谢大家。

【问题讨论】:

  • 如果您从@ManyToOne 的映射中删除 CascadeType.REMOVE,它不应该删除子级。你试过了吗?
  • 感谢您的回答...是的,我尝试了这个东西,但在这种情况下,没有任何内容被删除

标签: java hibernate jpa hibernate-annotations


【解决方案1】:

JPA 并不神奇。

按照@Andy Dufresne 的建议,删除CascadeType.REMOVE 注释。然后您必须在Telefono 中将Persona 设置为null,并在从持久性上下文中删除Persona 之前清除PersonaTelefono 集合。所以你必须删除所有关联。

您甚至可以将其与 @PreRemove 注释结合使用。

【讨论】:

  • 如果我将 Persona 设置为 null,在从数据库中删除记录并删除 CascaType 之前。删除记录已更新,但未删除...
  • 哪条记录?这样,应该更新 Telefono 并删除 Persona。您必须从双方删除关联。
  • 我解决了。我将关联的子方设置为空,然后从数据库中删除实体。这很好用。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多