У меня есть две таблицы, b
и a
:
- они имеют двустороннее отношение "один к одному"
a
имеет внешний ключb
, который определяет это отношение - этот внешний ключ также рассматривается как первичный ключ для
a
, а JPA @ID
- Я хочу каскадное удаление, которое удаляет связанные
b
когда a
удалено - в MySQL,
a
b_id
равно NOT NULL
Проблема заключается в том, что при удалении моего A
объект с JPA-хранилищем, я получаю ConstraintViolationException
на его внешний ключ.Я ожидаю, что строки a
и b
будут удалены (умно, начиная с единицы a
).
Как мне обойти это, зная, что я хочу сохранить:
- моя схема БД такая же
- каскадное удаление от
a
до b
- идентификатор
b
является JPA @Id
для a
CREATE TABLE `b` (
`dbid` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`dbid`),
);
CREATE TABLE `a` (
`b_id` int(11) NOT NULL,
KEY `b_fk` (`b_id`),
CONSTRAINT `b_fk` FOREIGN KEY (`b_id`) REFERENCES `b` (`dbid`),
);
@Entity
@Table(name = "a")
public class A {
@Id
@Column(name = "b_id")
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name="property", value="b"))
private Integer bId;
@OneToOne(cascade = CascadeType.REMOVE)
@PrimaryKeyJoinColumn
private B b;
}
@Entity
@Table(name = "b")
public class B {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "dbid")
private Integer id;
@OneToOne(mappedBy = "b")
private A a;
}
[ПРАВИТЬ] После всех обсуждений в комментариях и перечитывания моего вопроса предложения с orphanRemoval
действительно находятся в объеме и работают.