Java HSQLDB无法从JPA注释正确识别主键

Java HSQLDB无法从JPA注释正确识别主键,java,sql,hibernate,jpa,hsqldb,Java,Sql,Hibernate,Jpa,Hsqldb,我们使用Oracle作为生产数据库,使用HSQLDB作为单元测试数据库。这两种环境都使用Hibernate作为JPA提供程序。以下代码在生产环境中正常工作,但在jUnit下运行时抛出SQL错误:-104,SQLState:23505-完整性约束冲突:唯一约束或索引冲突。所涉实体为: @Entity @Table(name="TT_TEACHERSECTIONGROUP") public class TeacherSectionGroup implements TeacherSectionList

我们使用Oracle作为生产数据库,使用HSQLDB作为单元测试数据库。这两种环境都使用Hibernate作为JPA提供程序。以下代码在生产环境中正常工作,但在jUnit下运行时抛出
SQL错误:-104,SQLState:23505-完整性约束冲突:唯一约束或索引冲突。所涉实体为:

@Entity
@Table(name="TT_TEACHERSECTIONGROUP")
public class TeacherSectionGroup implements TeacherSectionListItem {
  @Id
  @Column(name="TEACHERSECTIONGROUPID",unique=true,nullable=false)
  @GeneratedValue(strategy=GenerationType.AUTO,generator="TT_TEACHERSECTIONGROUPID_SEQUENCE")
  @SequenceGenerator(name="TT_TEACHERSECTIONGROUPID_SEQUENCE",sequenceName="TT_TEACHERSECTIONGROUP_SQ")
  private Long id;
    .
    .
    .
  @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.DETACH)
  @JoinTable(name="TT_TEACHERSECTIONGROUPASSOC",joinColumns={
    @JoinColumn(name="TEACHERSECTIONGROUPID",referencedColumnName="TEACHERSECTIONGROUPID")
  },inverseJoinColumns={
    @JoinColumn(name="USERSDCID",referencedColumnName="USERSDCID"),
    @JoinColumn(name="SECTIONSDCID",referencedColumnName="SECTIONSDCID")
  })
  private List<TeacherSection> sections;
    .
    .
    .
使用主键类:

@Embeddable
public class TeacherSectionPK implements Serializable {
  @Column(name="SECTIONSDCID",nullable=false)
  private Long sectionId;

  @Column(name="USERSDCID",nullable=false)
  private Long usersDcid;
    .
    .
    .
日志中的(已清理)输出包含正在发出的以下hibernate语句:

DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 13820, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 13821, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 13957, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 13958, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 14234, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 14235, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUP (TEACHERSECTIONGROUPID, DISPLAYNAME, EXPRESSION, ISMODIFIED, NAME, POSITION, USERSDCID) values (default, <null>, 'Course(91642)', false, 'AP Chemistry', 0, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUP (TEACHERSECTIONGROUPID, DISPLAYNAME, EXPRESSION, ISMODIFIED, NAME, POSITION, USERSDCID) values (default, <null>, 'Course(723)', false, 'Gen Chemistry', 1, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUP (TEACHERSECTIONGROUPID, DISPLAYNAME, EXPRESSION, ISMODIFIED, NAME, POSITION, USERSDCID) values (default, <null>, 'Expression(3(A-B))', false, '3(A-B)', 2, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (1, 13820, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (1, 13821, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (2, 13957, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (2, 13958, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (2, 14234, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (2, 14235, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (3, 13957, 1)
WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - SQL Error: -104, SQLState: 23505
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - integrity constraint violation: unique constraint or index violation; SYS_CT_10323 table: TT_TEACHERSECTIONGROUPASSOC
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTION(显示名称、位置、SECTIONSDCID、USERSDCID)值(,13820,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTION(DISPLAYNAME,POSITION,SECTIONSDCID,USERSDCID)值(,13821,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTION(显示名称、位置、SECTIONSDCID、USERSDCID)值(,13957,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTION(显示名称、位置、SECTIONSDCID、USERSDCID)值(,13958,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTION(DISPLAYNAME、POSITION、SECTIONSDCID、USERSDCID)值(,14234,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTION(显示名称、位置、SECTIONSDCID、USERSDCID)值(,14235,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUP(TEACHERSECTIONGROUPID、DISPLAYNAME、EXPRESSION、ISMODIFIED、NAME、POSITION、USERSDCID)值(默认值为'Course(91642)'假'AP Chemistry',0,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUP(TEACHERSECTIONGROUPID、DISPLAYNAME、EXPRESSION、ISMODIFIED、NAME、POSITION、USERSDCID)值(默认值为'Course(723)'假'Gen Chemistry',1,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUP(TEACHERSECTIONGROUPID,DISPLAYNAME,EXPRESSION,ISMODIFIED,NAME,POSITION,USERSDCID)值(默认值,'EXPRESSION(3(A-B))',false,'3(A-B'),2,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUPASSOC(TEACHERSECTIONGROUPID,SECTIONSDCID,USERSDCID)值(1,13820,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUPASSOC(TEACHERSECTIONGROUPID,SECTIONSDCID,USERSDCID)值(1,13821,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUPASSOC(TEACHERSECTIONGROUPID,SECTIONSDCID,USERSDCID)值(2,13957,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUPASSOC(TEACHERSECTIONGROUPID,SECTIONSDCID,USERSDCID)值(2,13958,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUPASSOC(TEACHERSECTIONGROUPID、SECTIONSDCID、USERSDCID)值(2,14234,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUPASSOC(TEACHERSECTIONGROUPID、SECTIONSDCID、USERSDCID)值(2,14235,1)
DEBUG org.hibernate.SQL-插入TT_TEACHERSECTIONGROUPASSOC(TEACHERSECTIONGROUPID,SECTIONSDCID,USERSDCID)值(3,13957,1)
WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper-SQL错误:-104,SQLState:23505
错误org.hibernate.engine.jdbc.spi.SqlExceptionHelper-完整性约束冲突:唯一约束或索引冲突;系统CT_10323表:TT_TEACHERSECTIONGROUPASSOC
HSQLDB似乎只使用反向连接列作为JoinTable的主键,而不是所有列,这是有道理的(正如我在inter-Tube中看到的文档)


是否有一种机制我没有指定给HSQLDB哪些字段应该包含在主键中?由于这段代码实际上在Oracle(即生产环境)中正常工作,我不愿意重写它只是为了满足单元测试,所以我希望有一个答案在这两种环境中都同样有效。谢谢。

我认为区别在于您正在使用JPA在HSQL上创建表,但该模式在Oracle上已经存在。如果是这样的话,你有没有尝试过将你的关系指定为多人而不是一个多人。当您已经指定了一个联接表时,两者之间没有太大区别,但是我相信Hibernate处理DDL gen的方式不同您是否尝试将
@GeneratedValue
策略从
GenerationType.AUTO
更改为
GenerationType.SEQUENCE
?据我所知,
序列
策略利用生成器和序列配置。而且您不需要将
@Id
@Column
设置为必需的
nullable=false
,因为它已经隐式设置了。@chris,改为ManyToMany完成了这个技巧。如果你想加上这个答案,我很乐意把它标为正确答案。
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 13820, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 13821, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 13957, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 13958, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 14234, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTION (DISPLAYNAME, POSITION, SECTIONSDCID, USERSDCID) values (<null>, <null>, 14235, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUP (TEACHERSECTIONGROUPID, DISPLAYNAME, EXPRESSION, ISMODIFIED, NAME, POSITION, USERSDCID) values (default, <null>, 'Course(91642)', false, 'AP Chemistry', 0, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUP (TEACHERSECTIONGROUPID, DISPLAYNAME, EXPRESSION, ISMODIFIED, NAME, POSITION, USERSDCID) values (default, <null>, 'Course(723)', false, 'Gen Chemistry', 1, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUP (TEACHERSECTIONGROUPID, DISPLAYNAME, EXPRESSION, ISMODIFIED, NAME, POSITION, USERSDCID) values (default, <null>, 'Expression(3(A-B))', false, '3(A-B)', 2, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (1, 13820, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (1, 13821, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (2, 13957, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (2, 13958, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (2, 14234, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (2, 14235, 1)
DEBUG org.hibernate.SQL  - insert into TT_TEACHERSECTIONGROUPASSOC (TEACHERSECTIONGROUPID, SECTIONSDCID, USERSDCID) values (3, 13957, 1)
WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - SQL Error: -104, SQLState: 23505
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - integrity constraint violation: unique constraint or index violation; SYS_CT_10323 table: TT_TEACHERSECTIONGROUPASSOC