1

我想将一个具有 java.awt.geom.Point2D 字段的类放入 db 中。是否可以?

这是我的代码。

@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 类的字段?有可能吗?

4

3 回答 3

1

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

您还可以选择为Point2D该类定义自定义休眠类型。这是如何定义自定义休眠类型的链接。

于 2013-05-27T11:10:01.597 回答
0

您不能向现有类添加注释。

但是您可以定义 aCompositeUserType来告诉 Hibernate 如何映射 a Point2D

于 2013-05-27T11:09:34.457 回答
0

谢谢大家的回复。不幸的是java.awt.Point类使用Integer,所以在我的情况下它是无用的。解决它的最简单方法是使用Point2D.Doublewhich implements 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;
    }
}
于 2013-05-28T09:46:46.133 回答