【问题标题】:Hibernate annotation for base java class基 java 类的 Hibernate 注释
【发布时间】:2013-05-27 10:24:39
【问题描述】:

我想将具有 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 类的字段?有可能吗?

【问题讨论】:

    标签: java hibernate annotations


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        感谢大家的回复。不幸的是java.awt.Point 类使用Integer,所以在我的情况下它是没用的。解决它的最简单方法是使用实​​现Serializable 的Point2D.Double(但如果您不想更改类定义,UserType 或CompositeUserType 的定义更方便)。所以,简单的解决方案:

        @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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-06-03
          • 2014-11-20
          • 2011-12-07
          • 2011-01-12
          • 2013-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          相关资源
          最近更新 更多