java - 难以使用 JPA/Hibernate 创建与抽象类和嵌入属性的关系
问题描述
我正在尝试,但到目前为止还没有成功,将以下类与 Hibernate 一起使用。
@MappedSuperclass
@Embeddable
public abstract class Foo {
// atributes...
}
@Embeddable
public class Poo extends Foo {
// atributes...
}
@Entity
@Table
public class None {
// atributes...
@Embedded
private Foo foo;
// constructor
public None(Foo foo) {
this.foo = foo;
}
}
// example of save
None none = new None(Poo poo);
save(none);
Hibernate 返回:无法实例化抽象类或接口
是否可以使用 JPA 执行此操作?
解决方案
我遇到了同样的问题。
似乎@embedable
不适用于@DiscriminatorColumn
. 我可以让它工作的唯一方法是使用@DiscriminatorColumn
,但将其视为@embedable
同一张桌子上的单独实体。这意味着查询可能会将表连接到自身。
@Entity
@Table(name="tbComputers")
public class Computer{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long id;
public String motherboard;
@OneToOne
@JoinColumn(name="id")
public CPU cpu;
}
@Entity
@DiscriminatorColumn(name="cpu_type")
@Table(name="tbComputers")
public abstract class CPU {
@Id
private Long id;
@Column(name = "cpu")
public String name;
public abstract String someProcessorSpecificMethod();
}
@Entity
@DiscriminatorValue("Intel")
public class Intel extends CPU {
@Override
public String someProcessorSpecificMethod() {
return "Intel";
}
}
@Entity
@DiscriminatorValue("AMD")
public class AMD extends CPU {
@Override
public String someProcessorSpecificMethod() {
return "AMD";
}
}
编辑:经过进一步测试,我发现虽然这适用于读取数据,但它不适用于持久化。它将创建一个单独的 INSERT。似乎不支持https://hibernate.atlassian.net/browse/HHH-1910。另一种方法是拆分表。
推荐阅读
- c# - 如何通过将 IoC 的名称用作字符串来动态解析 IoC
- c++ - 为什么编译器不选择 `forward` 的右值引用版本?
- sql-server - 用于获取列组合的不重复数据的 SQL 语句
- android - START_STICKY 表示行为类似于服务的 Activity
- leaflet - 如何将用户名:密码传递给 Leaflet 中的基本身份验证外部 WMS
- javascript - 使用本机 javascript 实现 lodash _.has 的简单方法是什么?
- android - 检查 Google Login(Android) 是登录还是注册?
- javascript - 从类方法访问 javascript 中的类属性
- python-3.x - 如何用 tkinter Python 将 2 个标签分开很远?
- c# - 在 asp.net 中使用 ajax 调用更新下拉列表