我有两张桌子:Ta和Tb.它们具有完全相同的表结构但不同的表名.
我尝试创建一个实体类来映射表结构.我的一些常见应用程序模块将使用此实体类来动态查询和更新任何一个Ta或Tb基于参数.可以在JPA中完成吗?如何编写程序以在运行时将实体类动态映射到不同的表?
通用实体,超类:
@MappedSuperclass
public abstract class GenericEntity {
private Integer id;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
}
Run Code Online (Sandbox Code Playgroud)
pojo:
@Entity
@Table(name = "POJO_ONE")
@SequenceGenerator(name = "HB_SEQ_POJO_ONE", sequenceName = "SEQ_POJO_ONE", allocationSize = 1)
public class PojoOne extends GenericEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HB_SEQ_POJO_ONE")
@Column(name = "ID")
@AttributeOverride(name = "id", column = @Column(name = "ID"))
private Integer id;
@Override
public Integer getId() {return id;}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用thoses注释:@AttributeOverride,@ Id,...但它不起作用.你能帮助我吗?我想覆盖属性"id"以通过pojo/table指定另一个列名和序列.最好的方法是什么?
我想拥有一个对所有文档类型都通用的超类:
@Entity
public abstract class Doc implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected long docId;
public long getDocId()
{
return docId;
}
public void setDocId(long docId)
{
this.docId = docId;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望每个doc类型都有子类:
@Entity
@Table(name = "DocTypeA")
public class DocTypeA extends Doc implements Serializable
{
// other child fields
}
Run Code Online (Sandbox Code Playgroud)
但它给出了一个错误,并说DocTypeA需要一个主键.如何隔离主键并将其置于超类中?因为所有子类都具有相同的id字段.
我正在使用EclipseLink.
我的另一个问题是:为什么我需要加入@Entity抽象类?作为一个抽象类,它无法实例化,那么将它标记为实体有什么意义呢?真的有必要吗?我不会坚持超类.我只需要隔离所有子类中常见的代码.
堆栈跟踪很长,相关部分粘贴在下面:
Exception Description: Entity class [class repository.DocTypeA] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass. If you …Run Code Online (Sandbox Code Playgroud)