我在 MySQL 数据库中有两个实体,我想实现双向映射,在保存新父项时自动保存新子项。
MACCHINA(父)字段:id、marca
PERSONA(子)字段:id、name、macchina_id(外键 NOT NULL)
当我保存一个新的 MACCHINA 时,我还想通过这个 JSON 保存一个新的 PERSONA:
{
"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 ...
}
在这种情况下,当我在 Macchina 实体上调用 JPA 存储库方法 .save() 时,我遇到了例外:
> Caused by:
> com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
> Column 'macchina_id' cannot be null
在同样的场景中,我尝试在数据库中删除 Persona 表中字段“macchina_id”的 NotNull 约束;在这种情况下,事务已执行,但 Persona 表中的“macchina_id”字段为 NULL。
我找到了一种解决方法,方法是删除数据库中“macchina_id”的 NotNull 约束(以及实体中的注释),并以这种方式修改从父级到子级的映射:
@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(optional = false) 并使用 Spring/Hibernate 自动验证的“macchina_id”字段同时保存两个实体,无需手写代码。
那么,有一种自动方式(Spring/Hibernate)首先保存父级,然后是对父级有 NotNull 外键的子级?
有什么建议吗?
问候, 安德里亚