Hibernate DiscriminatorColumn.Type не работает

У меня есть абстрактный класс 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;

2 ответа

Я запустил приведенный выше код со столбцом t_type типа VARCHAR, он работал нормально. Типизирован ли столбец t_type в вашей базе данных VARCHAR?

Это ошибка Hibernate, работающая с postgres. Я понятия не имею, почему это хорошо, но если вы измените структуру таблицы, поместив столбец дискриминатора в качестве последнего поля таблицы, это сработает!

В вашем случае поместите "t_type" после столбца "building_id".

Я надеюсь, что это помогает!

Другие вопросы по тегам