2

我在 hibernate 和 JPA 中创建了一个父子类。当我尝试持久化该类时,我得到一个 SQL 异常,指出“无效的列索引”。

这是父类:

@Entity
@Table(name = "vnd_base_file_format")
public class VendorBaseFileFormat implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "base_file_format_id")
    private int baseFileFormatId;

    @Column(name = "vendor_id")
    private int vendorId;

    @Column(name = "format_name")
    private String formatName;

    @Column(name = "enabled")
    private boolean enabled;

    @Column(name = "month_year_format")
    private String monthYearFormat;

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="base_file_format_id", nullable=false)
    @OrderBy("index")
    private List<VendorBaseFileDimension> dimensions;

这是子类:

@Entity
@Table(name = "vnd_base_file_format_dim")
public class VendorBaseFileDimension implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "dimension_id")
    private int dimensionId;

    @Column(name = "alternate_name")
    private String alternateName;

    @Column(name = "dimension_index")
    private int index;

    @Id
    @ManyToOne
    @JoinColumn(name="base_file_format_id", nullable=false, insertable=false)
    private VendorBaseFileFormat format;

我只是创建父类并向其添加一个子类。当我调用 entityManager.persist 时,我收到以下消息:

Hibernate: insert into vnd_base_file_format (enabled, format_name, month_year_format, vendor_id, base_file_format_id) values (?, ?, ?, ?, ?)
Hibernate: insert into vnd_base_file_format_dim (alternate_name, dimension_index, base_file_format_id, dimension_id) values (?, ?, ?, ?)
[21:53:01.159] WARN  JDBCExceptionReporter - SQL Error: 17003, SQLState: 99999
[21:53:01.159] ERROR JDBCExceptionReporter - Invalid column index

任何帮助,将不胜感激。我尝试了一些方法,例如将 insertable 设置为 false,但没有运气。我确实看到了一个问题,提到复合键可能存在问题。当子级仅作为父级的一部分存在时,我真的必须在子级上创建一个唯一的序列列吗?

4

3 回答 3

1

我发现另一个问题的解决方案很有帮助。我将单个 id 列更改为复合键对象,这似乎对我有用。

我需要的主要信息可以在这篇文章中找到。

帮助我弄清楚的问题已发布在这里。

于 2012-08-04T02:29:54.933 回答
0

我认为出现索引列的问题是因为您使用 List 集合来保持关系。你可以做这样的事情:

1) 在 VendorBaseFileFormat 类中将 List 更改为 Set;

2) 将@IndexColumn(name="idx​​")注释添加到您的类中,并通过此列明确指定将用于保存列表索引。您还应该将此列添加到 *vnd_base_file_format_dim* 表中。在本教程中存在使用 List 的双向一对多映射示例(第 8 节)。

于 2012-08-03T08:52:09.320 回答
0

我可以看到您的 orderBy 注释的字段名称为“索引”。您应该为其他类的索引提供一个 getter,或者尝试将其更改为“dimension_index”。希望它应该解决这个问题。

于 2012-08-03T02:10:27.150 回答