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 {
}