【发布时间】:2017-07-21 10:19:06
【问题描述】:
我在 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 自动验证的“macchina_id”字段/休眠,无需手动编写代码。
那么,有一种自动方式(Spring/Hibernate)先保存父级,然后是对父级具有 NotNull 外键的子级?
有什么建议吗?
问候,安德里亚
【问题讨论】:
-
在保存
Macchina之前,将Macchina添加到每个PERSONA,如果你只想保存,还要设置CascadeType.All或Persist -
向我们展示您的代码如何保存
-
显示在新答案中
-
如前所述,在保存
Macchina之前,将Macchina添加到每个PERSONA -
也显示
macchinaMapper.toEntity(macchinaDTO);的代码
标签: hibernate spring-data-jpa one-to-many many-to-one bidirectional-relation