如何向实体添加方法(扩展)

时间:2014-03-20 15:44:58

标签: java jpa

假设我有一个像这样的实体

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。所以我尝试通过

扩展Category
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自动生成它时我都不想继续修改它。 提前谢谢。

4 个答案:

答案 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;一个实体到另一个实体这不起作用。

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html