我正在尝试用JPA做一些事情,它会在项目中使用很多,但我被卡住了。
我有2个实体+一种“胶水”实体,我称之为
我想添加一个新的ClassA,其中新的Glues设置在它的列表中,ClassB已经存在。
那会做类似的事情:
ClassA 1 | Glue 1 1 | ClassB 1 ClassA 1 | Glue 1 2 | ClassB 2 ClassA 1 | Glue 1 3 | ClassB 3 ClassA 1 | Glue 1 4 | ClassB 4
因此,要插入所述ClassA和所有Glues,ClassA会有一个List,其中包含要插入的新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
({{ 1}})ON UPETE NO ACTION更新无动作)
据我所知,他抱怨说Glues没有ClassA的参考设置,但是我希望他能填补它,然后他坚持使用ClassA。
这可以实现吗? 如果不是最好的方法是什么?
我希望在没有任何特定供应商技巧的情况下继续使用JPA(我正在使用eclipselink),但如果某个供应商能够轻松完成,我会选择它。
谢谢!
答案 0 :(得分:4)
我会删除EmbeddedId,改为使用IdClass,只需将@Id添加到@ManyToOne映射中。
请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0
或者甚至可能给Glue一个自己的id。
您还可以从@ManyToOne中删除insertable = false,updatable = false并将它们移动到EmbeddedId。