假设我有一个像这样的实体
package entity;
[imports]
@Entity
@Table(name = "category")
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@Column(name = "id")
private Short id;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name= "date")
@Temporal(TemporalType.TIMESTAMP)
private Date date;
public Category() {
}
public Category(Short id) {
this.id = id;
}
public Category(Short id, Date date) {
this.id = id;
this.date= date;
}
public Short getId() {
return id;
}
public void setId(Short id) {
this.id = id;
}
public String getDate() {
return date;
}
public void setDate(Date date) {
this.date= date;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
}
我需要为这个实体添加一些方法。例如,上面的例子有Date
,但我需要的是Calendar
。所以我尝试通过
public class CategoryExt extends Category{
private Calendar calendar;
public Calendar getCalendar() {
Calendar calendar = new Calendar();
calendar.setTime(this.getDate());
return calendar;
}
}
但是当我尝试强制转换或指定所提取的项目应该是收集的时候
Collection<CategoryExt>
我收到一个错误,分类无法转换为CategoryExt,我猜这与转发错误有关。
如何通过扩展来正确添加方法?我不想改变实体本身,因为每次我使用IDE自动生成它时我都不想继续修改它。
提前谢谢。
答案 0 :(得分:2)
在这种情况下,您根本不应扩展Category
实体。
只需创建一个带有函数的辅助类,如果传递Calendar
对象,则返回Date
。
答案 1 :(得分:1)
切换继承:
public class Category extends CategoryBase implements Serializable {...}
使用抽象类
public abstract class CategoryBase {
public abstract long getDate(); // long or whatever
public Calendar getCalendar() {
Calendar calendar = new Calendar();
calendar.setTime(getDate());
return calendar;
}
}
但是要知道:为非Javabean方法扩展Javabean很难看。
答案 2 :(得分:0)
如果你得到一个实体,请参见:
session.get(Category.class,1);
结果不是类别,它已经是类别(或代理,有时是适配器)的超类。
你尝试做的事情非常难看,因为Category是一个JavaBean,java-bean不支持像额外方法或复杂计算这样的业务逻辑。
答案 3 :(得分:0)
看看下面的教程,它将帮助您构建继承。基本上,您需要在表中引入discriminator属性,然后JPA将知道该行中保留了哪个实体。另一方面,你不能&#34;演员&#34;一个实体到另一个实体这不起作用。