为什么使用@JoinTable在双向@OneToMany上忽略@OrderColumn?

问题描述

我正在尝试提供产品的预览图片列表,该产品的插入顺序保存在数据库中。由于图片也用于其他实体,因此需要连接表。这些表是在带有Hibernate 5.4.22.Final的Spring Boot 2.3.3.RELEASE应用程序中使用liquibase创建的。

@Data
@Entity
@Table(name = "picture")
public class Picture {
  @Id
  @GeneratedValue(generator = "UUID")
  @GenericGenerator(name = "UUID",strategy = "org.hibernate.id.UUIDGenerator",parameters = {
      @Parameter(name = "uuid_gen_strategy_class",value = "org.hibernate.id.uuid.CustomVersionOnestrategy") })
  private UUID id;

  /** The product of which this picture is a preview picture of if any. */
  @ManyToOne(fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
  @JoinTable(name = "product_picture",joinColumns = {@JoinColumn(name = "picture_id")},inverseJoinColumns = {@JoinColumn(name = "product_id")})
  private Product product;
}

@Data
@Entity
@Table(name = "product")
public class Product {
  @Id
  @GeneratedValue(generator = "UUID")
  @GenericGenerator(name = "UUID",value = "org.hibernate.id.uuid.CustomVersionOnestrategy") })
  private UUID id;

  @OnetoMany(mappedBy = "product",fetch = FetchType.LAZY,CascadeType.REFRESH})
  @OrderColumn(name = "order_index")
  private List<Picture> previewPictures = new ArrayList<>();

  public Product addPreviewPicture(Picture previewPicture) {
    previewPictures.add(previewPicture);
    previewPicture.setProduct(this);
    return this;
  }
}

用于创建联接表的liquibase:

<createTable tableName="product_picture">
  <column name="product_id" type="${uuid_type}" >
    <constraints nullable="false"/>
  </column>
  <column name="picture_id" type="${uuid_type}" >
    <constraints nullable="false"/>
  </column>
  <column name="order_index" type="INT" >
    <constraints nullable="false" />
  </column>
</createTable>
<addPrimaryKey tableName="product_picture" columnNames="product_id,picture_id" constraintName="pk_product_picture" />
<addUniqueConstraint tableName="product_picture" columnNames="product_id,order_index" constraintName="un_product_id_order_index" />

当我尝试将预览图片附加到产品上并坚持使用该产品时,我得到了这个(简称):

[java.sql.BatchUpdateException: (conn=103668) Field 'order_index' doesn't have a default value],sql: insert into product_picture (product_id,picture_id) values (?,?)
o.h.engine.jdbc.spi.sqlExceptionHelper   : (conn=103668) Field 'order_index' doesn't have a default value
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not execute batch
...
Caused by: java.sql.sqlException: Field 'order_index' doesn't have a default value

我使用JpaRepository<..>来保留和加载实体,但是我也尝试直接使用EntityManager。我认为这无关紧要,但是此时有两个已配置且处于活动状态的数据库连接。 (如果需要,我也可以发布配置。)

Hibernate似乎完全忽略了@OrderColumn注释。看了几个小时后,我发现信息不一。一些网站建议,虽然此映射是正确的,但是休眠可能无法正确处理它。


问题:

  1. 此映射是否正确? (如果没有,需要更改什么?)

  2. Hibernate应该使用给定的注释来管理order_index还是在这里引起误解?

  3. 我是否总是必须在双向关系的两侧都设置属性? (如addPreviewPicture(..)中的

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)