我在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,但没有运气。我确实看到一个问题,提到复合键可能存在问题。当孩子只作为父母的一部分存在时,我真的必须在孩子身上创建一个独特的序列吗?
答案 0 :(得分:0)
我可以看到你的orderBy注释将该字段的名称称为“索引”。您应该从其他类中为索引提供一个getter,或者尝试将其更改为“dimension_index”。希望它能解决这个问题。
答案 1 :(得分:0)
我认为索引列存在问题是因为您使用List集合来保持关系。你可以这样做:
1)更改要在VendorBaseFileFormat类中设置的列表;
2)将 @IndexColumn(name =&#34; idx&#34;)注释添加到您的类中,并通过此列显式指定将用于保留列表索引。您还应该将此列添加到* vnd_base_file_format_dim *表。在这个tutorial存在的使用List的双向一对多映射的例子中(第8节)。
答案 2 :(得分:0)