Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 为JPA中的链接表自动生成多对多实体ID_Oracle_Hibernate_Jpa_Many To Many_Sequence - Fatal编程技术网

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

Oracle 为JPA中的链接表自动生成多对多实体ID,oracle,hibernate,jpa,many-to-many,sequence,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。这两个表是从一个公共基类扩展而来的,该基类带有序列生成器的@ID public abstract class ParentEntity { @Id @Column(name = "

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

我在实体Foo和Bar之间有双向多对多关系。名为FOO_BAR的链接表具有FOO_BAR_ID、FOO_ID和BAR_ID,第一个是表上的PK。它链接了FOO和BAR表,这两个表也有自己的PK、FOO_ID和BAR_ID。这两个表是从一个公共基类扩展而来的,该基类带有序列生成器的@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
}
这在执行SQL的基础上是有意义的,但我不确定如何生成链接表的PK


我相信你们中的许多人都能理解,由于客户的限制,这是必须的,但我不知道这是不可能的,还是我做错了什么。

您有两个主要选择:

1) 更改联接表,使其仅具有
FOO\u ID
BAR\u ID
,主键是这两个字段的组合


2) 如果希望联接表包含的不仅仅是
FOO\u ID
BAR\u ID
,则需要将联接表定义为单独的实体类(
FooBar
)。然后
Foo
Bar
将与
FooBar

有一对多的关联,我们最后只是为链接表创建了另一个实体。我希望有一个更优雅的解决方案,但这样就行了。
@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
}
@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
}
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")