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

Hibernate CompositeUserType映射的列数错误

巫马望
2023-03-14

我刚开始冬眠。写一个复合字体。当我运行代码时,我得到一个错误。所有物

映射的列数错误:请帮助我缺少什么?

我的组合类型如下

 public  class EncryptedAsStringType implements CompositeUserType {
 @Override
 public String[] getPropertyNames() {
    return new String[] { "stockId", "stockCode", "stockName","stockDescription" };
}


@Override
public Type[] getPropertyTypes() {
    //stockId, stockCode,stockName,modifiedDate
    return new Type[] { 
            Hibernate.INTEGER, Hibernate.STRING, Hibernate.STRING,Hibernate.STRING

    };
}
@Override
public Object getPropertyValue(final Object component, final int property)
        throws HibernateException {
    Object returnValue = null;
    final Stock auditData = (Stock) component;

    if (0 == property) {
        returnValue = auditData.getStockId();
    } else if (1 == property) {
        returnValue = auditData.getStockCode();
    } else if (2 == property) {
        returnValue = auditData.getStockName();
    }   return returnValue; 
}

@Override
public void setPropertyValue(final Object component, final int property,
        final Object setValue) throws HibernateException {
    final Stock auditData = (Stock) component;


}


 @Override
    public Object nullSafeGet(final ResultSet resultSet,
            final String[] names,
            final SessionImplementor paramSessionImplementor, final Object paramObject)
            throws HibernateException, SQLException {
        //owner here is of type TestUser or the actual owning Object
     Stock auditData = null;
        final Integer createdBy = resultSet.getInt(names[0]);
        //Deferred check after first read
        if (!resultSet.wasNull()) {
            auditData = new Stock();

            System.out.println(">>>>>>>>>>>>"+resultSet.getInt(names[1]));
            System.out.println(">>>>>>>>>>>>"+resultSet.getString(names[2]));
            System.out.println(">>>>>>>>>>>>"+resultSet.getString(names[3]));
            System.out.println(">>>>>>>>>>>>"+resultSet.getString(names[4]));
                 }
        return auditData;
    }


    @Override
    public void nullSafeSet(final PreparedStatement preparedStatement,
            final Object value, final int property,
            final SessionImplementor sessionImplementor)
            throws HibernateException, SQLException {
        if (null == value) {


        } else {
            final Stock auditData = (Stock) value;
            System.out.println("::::::::::::::::::::::::::::::::"+auditData.getStockCode());
            System.out.println("::::::::::::::::::::::::::::::::"+auditData.getStockDescription());
            System.out.println("::::::::::::::::::::::::::::::::"+auditData.getStockId());
            System.out.println("::::::::::::::::::::::::::::::::"+auditData.getStatus());


        }
    }

我的域类股票有五个属性。(股票ID、股票代码、股票名称、状态、股票描述)

我需要声明字段股票描述为复合字段类型。

 private Integer stockId;
private String stockCode;
private String stockName;
private String status;
private String stockDescription;

//Constructors  


@Column(name = "STOCK_CC", unique = true, nullable = false, length = 20)
@Type(type="com.mycheck.EncryptedAsStringType")
@Columns(columns = { @Column(name="STOCK_ID"),
    @Column(name="STOCK_CODE"),
    @Column(name="STOCK_NAME")

   })
public String getStockDescription() {
    return stockDescription;
}

}

当我尝试执行股票插入时。我得到的错误错误创建bean与名称

在类路径资源[spring/config/./database/Hibernate.xml]中定义的“sessionFactory”:

调用init方法失败。嵌套的异常是org。冬眠映射异常:

属性映射的列数错误:com.stock.model.Stock.stock描述类型:

通用域名格式。我的支票。加密密码字符串类型

我哪里做错了?

共有1个答案

范浩荡
2023-03-14

人们可以从代码示例和原始问题的注释中提取答案,但是为了节省每个人的阅读时间,我已经编译了一个快速摘要。

如果声明一个将类型映射到n列的CompositeUserType,则除了@type注释外,还必须在@columns中声明n列。例子:

public class EncryptedAsStringType implements CompositeUserType {
    @Override
    public String[] getPropertyNames() {
       return new String[] { "stockId", "stockCode", "stockName","stockDescription" };
    }

    // ...
}

CompositeUserType映射到4个单独的列,因此必须声明4个单独的@ColVIII注释:

@Type(type="com.mycheck.EncryptedAsStringType")
@Columns(columns = {
    @Column(name="STOCK_ID"),
    @Column(name="STOCK_CODE"),
    @Column(name="STOCK_NAME"),
    @Column(name="STOCK_DESCRIPTION")
})
public String getStockDescription() {
    return stockDescription;
}

就这样,Hibernate很高兴。

 类似资料:
  • 我有一个实体,看起来像这样: 输入数据是一个

  • 注意 当前章节中涉及的配置一般适用于关系数据库。这里展示的扩展方法在你安装了关系数据库提供程序之后就能获得(由Microsoft.EntityFrmeworkCore.Relational 程序包共享)。 列映射用于标识应该从数据库查询或写入哪些列数据。 惯例 按照惯例,实体类型属性会被设置为映射到与该属性同名的数据列上。 数据注解 可以使用数据注解来配置实体类型属性所映射的数据列。 public

  • 的默认行为 mapper() 在映射的 Table 到映射的对象属性中,每个属性都根据列本身的名称命名(特别是 key 属性 Column )这种行为可以通过几种方式进行修改。 从属性名称清楚地命名列 默认情况下,映射与 Column 与映射属性的相同-具体来说,它与 Column.key 属性对 Column ,默认与 Column.name . 指定给映射到的python属性的名称 Colum

  • 我有一个RDD格式为RDD[((Long,Long),(Long,Long))],我需要隐藏或转换为RDD[(Long,Long),(Long,Long,Long,Long))],其中第二个RDD元组基于第一个RDD的函数。 我正在尝试实现这个基于地图的功能,但是,我认为在这里做了一些错误的事情。请帮我解决这个问题。

  • > 状态: } 我在控制台得到的是: 或在创建类时 在这种情况下,如何正确创建实体或在表之间创建引用?

  • 我想使用Java流按对用户列表进行分组。 例如,我有。