当前位置: 首页 > 知识库问答 >
问题:

Hibernate验证导致错误的列类型错误

祁星阑
2023-03-14

我在应用程序部署期间进行Hibernate验证时遇到了一些问题。我有两个类,Frame和FrameReleasePlan,它们在OneToOne关系中关联。在数据库端,关系是单向的。frame_release_planss表有一个NUMERIC(19,0)类型的“frame_id”列,它是一个指向frame表“id”列的外键。当我尝试部署时,模式验证失败并出现错误:

无法生成Hibernate SessionFactory。原因:org。冬眠工具模式。spi。SchemaManagementException:架构验证:在表[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;
}

共有2个答案

云新知
2023-03-14

根据标准的hibernate基本类型表映射,jdbcNUMERIC类型映射到java。数学BigInteger和java。数学BigDecimal

所以,试着像这样纠正你的映射:

@Id
@DocumentId
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(columnDefinition = "NUMERIC(19,0)")
protected BigInteger id;
伍胡媚
2023-03-14

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

 类似资料:
  • 问题内容: 我正在从npm 使用此架构: 如果我尝试保存已经存在于db中的电子邮件,则如果省略该字段,我希望得到一个类似的电子邮件。但是事实并非如此,我得到了。 这不是验证错误(即使我删除了unique:true也会发生)。 知道为什么吗? 问题答案: 我更喜欢将其放在路径验证机制中,例如 然后,它将被包装,并在您调用或时作为第一个参数返回。

  • 问题内容: 非常奇怪的错误。我使用的是http://developers.facebook.com/docs/authentication/。所以我创建了对fb的请求并传递redirect_uri。我在本地主机上使用测试站点。所以如果我通过 redirect_uri = http://localhost/test_blog/index.php 它工作正常,但如果我通过 redirect_uri =

  • 我为Money类编写了一个自定义Hibernate验证约束: 它工作正常,除了错误信息。我看到了非常奇怪的行为:找到了资源包,消息按名称解析,但它被包裹在特殊的字符中,如果消息不能按名称解析,通常会出现这些字符: 此处

  • 尝试使用@SpringBootTest注释来运行单元测试时,我从Hibernate得到了这个错误。我能在网上找到的所有信息都说要将“hibernate.id.new_generator_mappings”设置为false,但这并不能解决我的问题。 2017-11-17 13:20:28.885警告11396--[main]O.s.w.cs.GenericWebApplicationContext:

  • 问题内容: python 3.5的新功能之一是受此项目启发的类型提示。 键入:PEP 484 –键入提示。 我想测试它,但是它没有按预期工作。 结果是: 我期待一个错误,因为我期望布尔作为回报。我在python:3.5(docker)和local上测试了它。我是否想念一些东西以使其起作用?这种键入是否在运行时不起作用(例如python app.py)? 问题答案: 请参阅您链接到的PEP中摘要的第

  • 我在客户机-服务器模式下使用H2数据库。服务器运行版本为1.3.175,客户端运行版本为1.3.168。 一切似乎都很好,但我在执行一些查询时遇到异常: org.h2.jdbc.jdbcsqlexception:常规错误:“java.lang.nullpointerexception”[50000-175]在org.h2.message.dbexception.getJDBCSqlexceptio