JPA,带外键的复合键+持久化oneToMany

时间:2012-07-03 11:45:44

标签: jpa-2.0 eclipselink java-ee-6

我正在尝试用JPA做一些事情,它会在项目中使用很多,但我被卡住了。

我有2个实体+一种“胶水”实体,我称之为

  • ClassA的
  • ClassB的

我想添加一个新的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: 无法添加或更新子行:外键约束失败(bddglue,CONSTRAINT constraint_name FOREIGN KEY(id_class_a)REFERENCES ClassA({{ 1}})ON UPETE NO ACTION更新无动作)

据我所知,他抱怨说Glues没有ClassA的参考设置,但是我希望他能填补它,然后他坚持使用ClassA。

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

我希望在没有任何特定供应商技巧的情况下继续使用JPA(我正在使用eclipselink),但如果某个供应商能够轻松完成,我会选择它。

谢谢!

1 个答案:

答案 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。