【问题标题】:hibernate and generic field mapping休眠和通用字段映射
【发布时间】:2011-08-10 10:28:52
【问题描述】:

我想用 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 的好的配置是什么? (我已经用“这里需要帮助”发表评论)

【问题讨论】:

    标签: hibernate generics hibernate-mapping


    【解决方案1】:

    我很确定您不能将单个 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;
        }
    }
    

    【讨论】:

    • 由于ParameterValue中的抽象getValue方法,这个方法似乎抛出了同样的异常
    • 确保使用字段访问而不是属性访问(@Access(AccessType.FIELD),或者在getValue方法中添加@Transient注解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    相关资源
    最近更新 更多