我正在尝试用 JPA 做一些在项目中会用到很多的东西,但我被卡住了。
我有 2 个实体 + 一种“胶水”实体,我会称它们为
- A类
- B类
- 胶水
我想添加一个新的 ClassA,在它的列表中设置了新的 Glues,ClassB 已经存在。
那会做类似的事情:
A 类 1 | 胶水 1 1 | B 类 1 A 类 1 | 胶水 1 2 | B 级 2 A 类 1 | 胶水 1 3 | B 级 3 A 类 1 | 胶水 1 4 | B 级 4
因此,正如要插入的 ClassA 和所有 Glues 一样,ClassA 有一个列表,其中包含要插入的新 Glues。
他们来了 :
@Entity
public class ClassA implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
(...)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "classA")
private List<Glue> glueList;
(...)
}
@Entity
public class ClassB implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
(...)
}
@Entity
public class Glue implements Serializable {
@EmbeddedId
protected GluePK gluePK;
@JoinColumn(name = "id_class_a", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
@ManyToOne(optional = false)
private ClassA classA;
@JoinColumn(name = "id_class_b", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
@ManyToOne(optional = false)
private ClassB classB;
(...)
}
@Embeddable
public class GluePK implements Serializable {
@Basic(optional = false)
@NotNull
@Column(name = "id_class_a", nullable = false)
private int idClassA;
@Basic(optional = false)
@NotNull
@Column(name = "id_class_b", nullable = false)
private int idClassB;
(...)
}
当我尝试坚持我的 ClassA 时,我得到了类似的东西:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败(bdd
. glue
, CONSTRAINT constraint_name
FOREIGN KEY ( id_class_a
) REFERENCES ClassA
( id
) ON DELETE NO ACTION ON UPDATE NO ACTION)
我知道他抱怨 Glues 没有 ClassA 的参考集,但我希望他在他坚持 ClassA 时填写它。
这是可以实现的吗?如果不是最好的方法是什么?
我想在没有任何特定供应商技巧的情况下继续使用 JPA(我正在使用 eclipselink),但如果某些供应商可以轻松做到这一点,我会去做。
谢谢!