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".
Я надеюсь, что это помогает!