如何解决为什么使用@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
注释。看了几个小时后,我发现信息不一。一些网站建议,虽然此映射是正确的,但是休眠可能无法正确处理它。
问题:
-
此映射是否正确? (如果没有,需要更改什么?)
-
Hibernate应该使用给定的注释来管理order_index还是在这里引起误解?
-
我是否总是必须在双向关系的两侧都设置属性? (如
addPreviewPicture(..)
中的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。