oracle - 为 JPA 中链接表的多对多实体自动生成 ID

标签 oracle hibernate jpa many-to-many sequence

我的问题是,当我在多对多关系中插入实体时,我无法获得在链接表中自动生成的 ID。

我在实体 Foo 和 Bar 之间有一个双向的多对多关系。名为 FOO_BAR 的链接表有 FOO_BAR_ID、FOO_ID 和 BAR_ID,第一个是表上的 PK。它链接 FOO 和 BAR 表,它们也有自己的 PK、FOO_ID 和 BAR_ID。这两个扩展自一个公共(public)基类,该基类具有带有序列生成器的@Id。

public abstract class ParentEntity {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator =  "generator")
    @SequenceGenerator(name = "generator", sequenceName = "some_sequence")
    protected Long id;
    //...getters/setters
}

实体 Foo 位于 FOO 表中,其 PK 名为 FOO_ID。
@Entity
@Table(name = "FOO")
@AttributeOverride(name = "id", column = @Column(name = "FOO_ID"))
public class Foo extends ParentEntity {
    @Column(name = "name")
    protected String name;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "FOO_BAR",
          joinColumns = @JoinColumn(name = "FOO_ID"),
          inverseJoinColumns = @JoinColumn(name = "BAR_ID"))
    protected Set<Bar> bars;
    //...getters/setters
}

此实体 Bar 是 BAR 表,具有自己的 BAR_ID PK。
@Entity
@Table(name = "BAR")
@AttributeOverride(name = "id", column = @Column(name = "BAR_ID"))
public class Bar extends ParentEntity {
    @Column(name = "name")
    protected String name;

    @ManyToMany(mappedBy = "bars", cascade=CascadeType.ALL)
    protected Set<Foo> foos;
    //...getters/setters
}

链接表有 FOO_ID、BAR_ID 和它自己的称为 FOO_BAR_ID 的 PK。

问题是当我尝试插入一个新的 Foo 时,没有为 FOO_BAR 链接表中的 PK 插入一个 ID。其他两个 ID 看起来可以很好地插入。

当我坚持使用以下内容时:
@Transactional
public void baz() {
    Foo foo = new Foo();
    Bar bar = entityManager.find(barId);
    foo.setBars(new HashSet<Bar>());
    foo.getBars().add(bar);
    entityManager.persist(foo);
    //also tried .merge just for giggles
}

On persist 是错误发生的地方。查看 SQL 日志,这是得到的输出:
DEBUG: org.hibernate.SQL - select some_sequence.nextval from dual
DEBUG: org.hibernate.SQL - insert into FOO (FOO_ID, NAME) values (?, ?)
DEBUG: org.hibernate.SQL - insert into FOO_BAR (FOO_ID, BAR_ID) values (?, ?)
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1400, SQLState: 23000
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-01400: cannot insert NULL into ("MY_SCHEMA"."FOO_BAR"."FOO_BAR_ID")

这基于执行的 SQL 是有道理的,但我不确定如何生成链接表的 PK。

我相信你们中的许多人都会欣赏,由于客户的限制,这只是它必须的方式,但我不知道这是不可能的,还是我做错了什么。

最佳答案

您有两个主要选择:

1) 更改连接表,使其只有 FOO_IDBAR_ID主键是这两个字段的组合,

或者

2) 如果您希望连接表包含的不仅仅是 FOO_IDBAR_ID ,那么您需要将连接表定义为单独的实体类 (FooBar)。然后两个 FooBar将与 FooBar 建立一对多关联.

关于oracle - 为 JPA 中链接表的多对多实体自动生成 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361898/

相关文章:

java - Spring 测试失败 : java. lang.NoClassDefFoundError: org/springframework/cglib/transform/impl/MemorySafeUndeclaredThrowableStrategy

spring - java.lang.IllegalArgumentException : Unknown entity 异常

oracle - 如何同时使用其他表中的数据更新具有空值的表?

java - 我可以将 HQL 与 JPA 的 @Query 注释一起使用吗?

sql - oracle中分组排序

java - Jersey API + JPA/Hibernate Criteria 延迟加载不起作用

java - Spring JPA 配置 IllegalArgumentException : No persistence unit with name found

java - Hibernate 工具给出 "Caused by: java.lang.NoSuchMethodError: javax.persistence.SequenceGenerator.catalog()Ljava/lang/String;"

sql - Oracle to_date,从 MM-DD-YYYY 中减去 DDMMYY

sql - 如何在触发器中引用自定义类型行