【问题标题】:Hibernate Validation Causing Wrong Column Type ErrorHibernate 验证导致错误的列类型错误
【发布时间】:2021-02-05 20:57:15
【问题描述】:

我在应用程序部署期间的休眠验证有点问题。我有两个类,Frame 和 FrameReleasePlan,它们以 OneToOne 关系关联。在数据库方面,这种关系是单向的。 frame_release_planss 表有一个 NUMERIC(19,0) 类型的“frame_id”列,它是指向框架表的“id”列的外键。当我尝试部署时,架构验证失败并出现错误:

无法构建 Hibernate SessionFactory。造成的: org.hibernate.tool.schema.spi.SchemaManagementException: 架构验证:列 [frame_id] 中遇到错误的列类型 在表 [frame_release_plans] 中;找到 [numeric (Types#NUMERIC)],但是 期待 [bigint (Types#BIGINT)]"}

我尝试使用@JoinColumn 注释的“columnDefinition”参数手动指定列类型,但没有任何区别。有什么办法可以通过将数据库列更改为“bigint”来解决这个问题?

persistence.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;
}

【问题讨论】:

    标签: java sql-server hibernate jpa


    【解决方案1】:

    问题应该出在您选择将 Product 类的字段“id”映射到相关数据库列的类型中。
    Hibernate 能够将每个数据库列类型映射到特定的 Java 类型。 特别是您可以拥有:

    NUMERIC BigInteger 或 BigDecimal
    BIGINT long 或 Long

    因此,要解决此问题,我建议您将产品的“id”字段类型从 Long 更改为 BigInteger,或者将数据库列类型从 NUMERIC 更改为 BIGINT。

    【讨论】:

    • 我不明白为什么我在答案中输入的表格未按预期格式化。我不得不删除它。很抱歉:(
    【解决方案2】:

    根据standard hibernate basic types表映射jdbcNUMERIC类型映射到java.math.BigIntegerjava.math.BigDecimal

    所以,尝试像这样更正您的映射:

    @Id
    @DocumentId
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(columnDefinition = "NUMERIC(19,0)")
    protected BigInteger id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2023-03-15
      • 2013-02-04
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多