基础java类的Hibernate注释

时间:2013-05-27 10:24:39

标签: java hibernate annotations

我想在db中放入一个有java.awt.geom.Point2D字段的类。有可能吗?

这是我的代码。

@Entity
@Table(name = "my_class_table")
public class MyClass {
  private String aliasId;

  private Point2D field;

  public Point2D getField() {
    return field;
  }

  public void setFieldPoint2D field) {
    this.field = field;
  }

  public String getAliasId() {
    return aliasId;
  }

  public void setAliasId(String aliasId) {
    this.aliasId = aliasId;
  }
}

抛出异常的原因:

无法确定类型:java.awt.geom.Point2D,在表:my_class_table,对于列:[org.hibernate.mapping.Column(field)]

当然,原因很明显。我的问题是:我应该如何注释类以便能够使用Point2D类的字段?它有可能吗?

3 个答案:

答案 0 :(得分:1)

最简单的方法是使用java.awt.Point扩展Point2D并且是Serializable类。这样,hibernate会自动将其映射到SerializableType,您不需要再做任何事情。 point对象将以序列化形式保存在blob数据库表列中。

您还可以选择为Point2D类定义自定义hibernate类型。 Here is a link如何定义自定义hibernate类型。

答案 1 :(得分:0)

您无法向现有类添加注释。

但是你can define a CompositeUserType告诉Hibernate如何映射Point2D

答案 2 :(得分:0)

谢谢你的回复。不幸的是java.awt.Point班级使用Integer,所以在我的案例中它没用。解决问题的最简单方法是使用Point2D.Double来实现Serializable(但如果您不想改变,UserTypeCompositeUserType的定义会更方便类定义)。所以,简单的解决方案:

@Entity
@Table(name = "my_class_table")
public class MyClass {
  private String aliasId;

  private Point2D.Double field;

  public Point2D.Double getField() {
    return field;
  }

  public void setField(Point2D.Double field) {
    this.field = field;
  }

  public String getAliasId() {
    return aliasId;
  }

  public void setAliasId(String aliasId) {
    this.aliasId = aliasId;
  }
}

但我的最终目标是创建一个有序列表的类。如果有人感兴趣,这里是代表一行的类的例子:

@Entity
public class Line {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idDb", unique = true, nullable = false)
    private int id;

    @ElementCollection
    @CollectionTable(name="points_table", joinColumns = @JoinColumn(name="idDb"))
    @IndexColumn(name = "idx")
    @Column(name="point_val")
    private List<Point2D.Double> points = new ArrayList<Point2D.Double>();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Point2D.Double> getPoints() {
        return points;
    }

    public void setPoints(List<Point2D.Double> points) {
        this.points = points;
    }
}