Java Hibernate与实体的动态包装

Java Hibernate与实体的动态包装,java,hibernate,Java,Hibernate,可能是一个常见问题,但无论如何: 假设我有一个简单的实体任务,其中有一个活动实体列表: @Entity @Table(name = "task") public class Task { @Id @Column(name = "id") private Integer id; @OneToMany @JoinColumn(name = "task_id") private List<Activity> activities; }

可能是一个常见问题,但无论如何:

假设我有一个简单的实体任务,其中有一个活动实体列表:

@Entity
@Table(name = "task")
public class Task {

    @Id
    @Column(name = "id")
    private Integer id;

    @OneToMany
    @JoinColumn(name = "task_id")
    private List<Activity> activities;
}
在这里,我想做一些魔术——根据活动类型,我希望hibernate使用不同的活动实现填充Task.activities,例如,如果Activity.type==1,我希望ActivityAImpl在那里,如果Activity.type==2——它应该是ActivityBImpl等等。。基本上,我的所有活动都将实现一个带有某个方法execute的单一接口

希望有一个简单的解决方案


谢谢你的帮助

看看@MappedSuperClass和@Discriminator注释。我想这就是你要找的。这是一个例子


没有测试这个,但我认为这应该是有效的

@Entity
@Table(name = "activity")
@Inheritance
@DiscriminatorColumn(name = "activity_type", discriminatorType = DiscriminatorType.INTEGER)
public abstract class Activity {

    @Id
    @Column(name = "id")
    private Integer id;
}

@Entity
@DiscriminatorValue("1")
public class ActivityImpl1 extends Activity {

}

@Entity
@DiscriminatorValue("2")
public class ActivityImpl2 extends Activity {

}

谢谢它可以编译,但当我编译时:Activity getCurrentSession.getActivity.class,id;它抛出:无法实例化抽象类或接口:com.xxx.activity这是正常的。活动是一个抽象类。。。你应该做getCurrentSession.getActivityImpl1.class,谢谢!这肯定是我在寻找的,但我不确定我该如何检索活动?当我这样做时:活动getCurrentSession.getActivity.class,id;它抛出:无法实例化抽象类或接口:com.xxx.Activity我认为getclass,id将无法工作。因为它将尝试创建抽象类的实例。改为使用查询,如getCurrentSession.createQuerySELECT a FROM Activity a,其中a.id=:id.setParamid,id.UniQuereResult;不,它现在很好用,我只是忘了提到我的孩子在课堂上的注释:非常感谢!
@Entity
@Table(name = "activity)
@Inheritance
@DiscriminatorColumn(name = "activity_type")
public abstract class Activity {

    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "activity_type")
    private int type;

    public abstract void execute();
}

@Entity
@DiscriminatorValue("1")
public class ActivityImplA extends Activity {

     public void execute() {
        .... Impl a
     }

}

@Entity
@DiscriminatorValue("2")
public class ActivityImplB extends Activity {

     public void execute() {
        .... Impl b
     }

}
@Entity
@Table(name = "activity")
@Inheritance
@DiscriminatorColumn(name = "activity_type", discriminatorType = DiscriminatorType.INTEGER)
public abstract class Activity {

    @Id
    @Column(name = "id")
    private Integer id;
}

@Entity
@DiscriminatorValue("1")
public class ActivityImpl1 extends Activity {

}

@Entity
@DiscriminatorValue("2")
public class ActivityImpl2 extends Activity {

}