2

我有一个抽象类 AbstractTile

@Entity
@Table(name = "TILES")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "t_type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "abstractTile")
public class AbstractTile {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
private int id;
//and so on
}

以及许多继承自 AbstractTile 的类

@Entity
@DiscriminatorValue(value = "dirt")
public class DirtTile extends AbstractTile{
//some code
}

@Entity
@DiscriminatorValue(value = "grass")
public class GrassTile extends AbstractTile{
//some code
}

@Entity
@DiscriminatorValue(value = "water")
public class WaterTile extends AbstractTile{
//some code
}

问题是当我想将它们保存到数据库中时,它有错误

Hibernate: 
insert 
into
    TILES
    (/*some data*/, t_type) 
values
    (/*some data*/, 'dirt') 

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Wrong value for type int : dirt

我究竟做错了什么?DiscriminatorType 设置为 String 那么为什么它需要 int 呢?

编辑:SQL 创建语句

CREATE TABLE tiles
(
  t_type character varying(31) NOT NULL,
  id serial NOT NULL,
  isaccesible boolean,
  x integer NOT NULL,
  y integer NOT NULL,
  map_id integer NOT NULL,
  building_id integer,
  CONSTRAINT tiles_pkey PRIMARY KEY (id),
  CONSTRAINT fk4c20b65b1a758e7 FOREIGN KEY (building_id)
      REFERENCES physical_building (building_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk4c20b65bd903ec4 FOREIGN KEY (map_id)
      REFERENCES map (map_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE tiles
  OWNER TO postgres;
4

2 回答 2

0

那是与 postgres 一起运行的 Hibernate 错误。我不知道为什么会这样,但是如果您更改表结构,将鉴别器列作为表上的最后一个字段,它就可以工作!

在您的情况下,将“t_type”放在“building_id”列之后。

我希望它有帮助!

于 2014-08-11T17:35:29.400 回答
0

我使用 VARCHAR 类型的 t_type 列运行了上面的代码,它运行良好。您的数据库中的 t_type 列是 VARCHAR 类型的吗?

于 2013-11-26T21:51:38.177 回答