java - Hibernate 验证导致错误的列类型错误
问题描述
我在应用程序部署期间的休眠验证有点问题。我有两个类,Frame 和 FrameReleasePlan,它们以 OneToOne 关系关联。在数据库方面,这种关系是单向的。frame_release_planss 表有一个 NUMERIC(19,0) 类型的“frame_id”列,它是指向框架表的“id”列的外键。当我尝试部署时,模式验证失败并出现错误:
无法构建 Hibernate SessionFactory。引起:org.hibernate.tool.schema.spi.SchemaManagementException:Schema-validation:在表[frame_release_plans]的列[frame_id]中遇到错误的列类型;找到 [numeric (Types#NUMERIC)],但期待 [bigint (Types#BIGINT)]"}
我尝试使用 @JoinColumn 注释的 'columnDefinition' 参数手动指定列类型,但没有任何区别。有什么办法可以通过将数据库列更改为“bigint”来解决这个问题?
持久性.xml
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="ProductPersistenceUnit"
transaction-type="JTA">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2012Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.id.new_generator_mappings" value="false"/>
</properties>
</persistence-unit>
</persistence>
代码片段:
@Entity(name = "FrameReleasePlan")
@Table(name = "frame_release_plans")
@Audited
@Access(AccessType.FIELD)
public class FrameReleasePlan extends AbstractFrameReleasePlan
{
@OneToOne
@JoinColumn(name = "frame_id")
protected Frame frame;
}
@Entity(name = "Frame")
@DiscriminatorValue("FRAME")
public class Frame extends Product
{
@OneToOne(mappedBy = "frame", cascade = { CascadeType.ALL }, orphanRemoval = true)
protected FrameReleasePlan releasePlan;
}
@javax.persistence.Entity(name = "Product")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "products")
public abstract class Product extends Entity
{
@Id
@DocumentId
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(columnDefinition = "NUMERIC(19,0)")
protected Long id;
}
解决方案
问题应该在于您选择将 Product 类的字段“id”与相关数据库列映射的类型。
Hibernate 能够将每个数据库列类型映射到特定的 Java 类型。特别是您可以拥有:
NUMERIC <---> BigInteger 或 BigDecimal
BIGINT <---> long 或 Long
因此,要解决此问题,我建议您将产品的“id”字段类型从Long
更改为BigInteger
,或者,从 NUMERIC 到 BIGINT 的数据库列类型。
推荐阅读
- python - Python:如何优化或简化以下代码?
- ubuntu - Gnome Tweak Tool 不保存更改
- excel - 在 VBA WinHttpRequest 上捕获超时
- java - Web 应用程序运行正常但重新启动计算机返回:源服务器未找到目标资源的当前表示
- opencart - Opencart v3 调用 webhook
- c# - 如何在同一解决方案中从 c# 项目接收 vb 项目中的事件
- java - ...NoteController 中的字段存储库需要一个类型为 ...NoteRepository 的 bean,但无法找到
- electron - 如何使用电子存储将对象插入到对象数组中
- python - 通过一行和每个列名迭代数据框并为 bkoeh-heatmap 填充新数据框
- distance - 计算点云中所有对的测地距离