当前位置: 首页 > 面试题库 >

Hibernate和通用字段映射

祁鸿晖
2023-03-14
问题内容

我想用Hibernate映射超类中的通用字段。

我的母亲班是:

@Entity
@Table(name = "ParameterValue")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "parameterType", discriminatorType = DiscriminatorType.STRING)
public abstract class ParameterValue<C>
{
    private C value;

    /* HELP NEEDED HERE */
    public C getValue()
    {
        return value;
    }

    public void setValue(C value)
    {
        this.value = value;
    }
}

一个子类:

@Entity
@DiscriminatorValue(value = "integer")
@AttributeOverride(name = "value", column = @Column(name = "intValue"))
public class IntegerParameterValue extends ParameterValue<Integer>
{
}

如您所见,我将覆盖value字段以指定要在数据库中使用的列。我的表ParameterValue由几列组成,每种类型对应一列。

CREATE TABLE `ParameterValue` (
    `intValue` int(11) DEFAULT NULL,
    `doubleValue` double DEFAULT NULL,
    `stringValue` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

但是hibernate抱怨:

ParameterValue.value has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type

好的,但是超类中getValue的良好配置是什么?(我在“需要帮助的地方”发表了评论)


问题答案:

我很确定您不能将单个Java属性映射到三个不同的列。您将必须使用此:

@Entity
@Table(name = "ParameterValue")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "parameterType", discriminatorType = DiscriminatorType.STRING)
public abstract class ParameterValue<C> {
    public abstract C getValue();

    public abstract void setValue(C value);
}

@Entity
@DiscriminatorValue(value = "integer")
public class IntegerParameterValue extends ParameterValue<Integer> {
    @Column(name = "intValue")
    private Integer intValue;

    @Override
    public Integer getValue() {
        return intValue;
    }

    @Override
    public void setValue(Integer value) {
        this.intValue = value;
    }
}


 类似资料:
  • 我有三个表A表有字段 带字段的表B 带字段的表C 和分别引用表A的和表B的。表C的postgres定义如下: 然而,在我的代码中,我不需要表C的实体。所以我希望能够在@ManyToOne关系中映射实体A和B: 我有一个测试是这样的: 在断言中失败。 我做错了什么?

  • Navicat 会依源表或集合对字段类型和长度作出假设。你可以从下拉式列表选择你所需的类型。 【提示】导入多个表或集合时,你可以从“源表”或“源集合”下拉式列表选择其他表或集合。 如果你导入数据到现有的表或集合,你则需要手动映射源字段名到目标,或右击并从弹出式菜单选择“智慧配对全部字段”、“直接匹配全部字段”和“全部取消匹配”来进行快速匹配。 如果你透过 ODBC 导入,“条件式查询”按钮会打开“

  • Navicat 会依源表或集合对字段类型和长度作出假设。你可以从下拉式列表选择你所需的类型。 【提示】导入多个表或集合时,你可以从“源表”或“源集合”下拉式列表选择其他表或集合。 如果你导入数据到现有的表或集合,你则需要手动映射源字段名到目标,或右击并从弹出式菜单选择“智慧配对全部字段”、“直接匹配全部字段”和“全部取消匹配”来进行快速匹配。

  • Navicat 会依源表或集合对字段类型和長度作出假设。你可以从下拉式菜单选择你所需的类型。 【提示】导入多个表或集合时,你可以从下拉式菜单选择其他表或集合。 如果你导入数据到现有的表或集合,你则需要手动映射源字段名到目标,或按住 Control 键并点按字段,然后选择“智慧匹配全部字段”、“按次序匹配全部字段”和“全部取消匹配”来进行快速匹配。 如果你透过 ODBC 导入,“条件式查询”按钮会打

  • 我试图在多对一关系字段上使用Java的Hibernate@Filter,但当我启用该过滤器并尝试使用AJAX中的StockDailyRecord服务调用getAll方法时,我得到了以下结果: 这是我定义过滤器的实体: 但是,当我用数据库“stock_id”中的实际列更改过滤器,并将其与我希望的id进行比较时,过滤器可以正常工作。 以下是我如何在StockDailyRecordService中启用过

  • 我正在使用Hibernate 4.1和Notess从Java映射到DB。 我有一个超类,它的属性是使用<code>@MappedSuperClass</code>映射的。 这个类有很多子类,但是有些属性对某些子类无效,因此我不想将它们映射到这些子类的数据库中。 有什么方法可以实现这一点吗? 另外,我不确定这是否是正确的设计,其中只有超类的属性子集适用于子类?我也愿意改变设计,如果有人能给我一个有效