hibernate and generic field mapping

梦想的初衷 提交于 2019-12-19 11:05:27

问题


I want to map a generic field in a superclass with Hibernate.

My mother class is :

@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;
    }
}

One subclass :

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

As you can see I override the value field to specify what column to use in the database. My table ParameterValue is composed of several column, one for each type.

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

But hibernate complains that :

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

Ok, but what's the good configuration for getValue in the superclass ? (I've put a comment with "HELP NEEDED HERE")


回答1:


I'm pretty sure you can't map a single Java attribute to three different columns. You will have to use this:

@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;
    }
}


来源:https://stackoverflow.com/questions/7009344/hibernate-and-generic-field-mapping

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!