2

我正在尝试用 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_nameFOREIGN KEY ( id_class_a) REFERENCES ClassA( id) ON DELETE NO ACTION ON UPDATE NO ACTION)

我知道他抱怨 Glues 没有 ClassA 的参考集,但我希望他在他坚持 ClassA 时填写它。

这是可以实现的吗?如果不是最好的方法是什么?

我想在没有任何特定供应商技巧的情况下继续使用 JPA(我正在使用 eclipselink),但如果某些供应商可以轻松做到这一点,我会去做。

谢谢!

4

1 回答 1

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。

于 2012-07-03T13:21:36.033 回答