我有兩個實體在MySQL DB中,我想實現一個雙向映射,自動保存新孩子保存一個新的父母時。保存父母和孩子的實體在同一個notnull外鍵的父母(春季JPA /休眠)
MACCHINA(父)字段:ID,馬卡
PERSONA(子)字段:ID,諾姆,macchina_id(外鍵NOT NULL)
當我保存一個新MACCHINA,我想也救新PERSONA這個JSON:
{
"marca": "string",
"personas": [
{
"nome": "string"
}
]
}
MACCHINA實體:
@Entity
@Table(name = "macchina")
public class Macchina implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "marca", nullable = false)
private String marca;
@OneToMany(mappedBy = "macchina", cascade = CascadeType.ALL)
private Set<Persona> personas = new HashSet<>();
// getters and setters ...
}
PERSONA實體:
@Entity
@Table(name = "persona")
public class Persona implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "nome", nullable = false)
private String nome;
@ManyToOne(optional = false)
@JoinColumn(name="macchina_id", referencedColumnName = "id", nullable = false)
private Macchina macchina;
// getters and setters ...
}
在這種情況下,當我打電話的JPA庫法.save()的Macchina實體,我有例外:
> Caused by:
> com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
> Column 'macchina_id' cannot be null
同樣在這一場景中,我嘗試在數據庫中刪除Persona表中字段「macchina_id」的NotNull約束;在這種情況下,事務被執行,但Persona表中的「macchina_id」字段爲NULL。
我發現了一個變通的數據庫(在實體和註釋)去除NOTNULL約束的「macchina_id」,並通過這種方式從父母向子女修改映射:
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "macchina_id")
private Set<Persona> personas = new HashSet<>();
我刪除了「mappedBy」並添加了@JoinColumn。 以這種方式工作:Hibernate在Macchina中執行插入操作,插入到Persona中,最後更新Persona(我想寫入/更新macchina_id字段)。
我的目標是維護數據庫中字段「macchina_id」的NotNull屬性;在映射字段private Macchina macchina;
(如@NotNull/nullable = false/@ManyToOne(可選= false))的子實體中保留一些屬性值,並使用Spring/Hibernate自動驗證的「macchina_id」字段同時保存這兩個實體,無需手動編寫代碼。
因此,有一種自動方式(Spring/Hibernate)先保存父項,然後保存對父項有NotNull外鍵的子項?
有什麼建議嗎?
問候,安德烈
,加如果你想只保存 –
告訴我們你的代碼如何保存 –
在新的答案中顯示 –