Java 休眠鉴别器列。类型不工作

Java 休眠鉴别器列。类型不工作,java,hibernate,discriminator,Java,Hibernate,Discriminator,我有一个抽象类AbstractTile @Entity @Table(name = "TILES") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "t_type", discriminatorType = DiscriminatorType.STRING) @DiscriminatorValue(value = "abstractTile") public class Abst

我有一个抽象类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
}
@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
}
还有许多继承自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
}
@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语句

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;

我用VARCHAR类型的t_类型列运行了上面的代码,它运行得很好。数据库VARCHAR中的t_type列是否已键入

这是一个与postgres一起运行的Hibernate bug。我不知道为什么会发生这种情况,但如果您更改表结构,将鉴别器列作为表上的最后一个字段,它就会工作

在您的案例中,将“t_类型”放在“building_id”列之后


我希望有帮助

它是wierd,但是我的数据库中没有列t_类型。Iam使用PostgreSQL,列类型为字符变化类型。抽象tile映射到许多其他类中的一个。问题是否存在?发布TILES表的createsql可能会有所帮助。此外,在超类中不需要有DiscriminatorValue。