我正在使用Hibernate和JPA连接到MySql数据库。数据库是在应用程序启动之前创建的,因此Hibernate不会为我构建数据库。此应用程序是要部署到tomcat的webapp。
对于一个表,我使用一些泛型来处理某些可能是String
,Integer
或Boolean
的值。该表是使用以下语句创建的:
CREATE TABLE IF NOT EXISTS `registry` (
`DTYPE` varchar(31) NOT NULL,
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`configName` varchar(255) NOT NULL,
`label` varchar(255) NOT NULL,
`configValue` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
它正在处理的类是一个抽象类库,它有三个扩展抽象的类。像这样:
@Entity
@Table(name = "registry")
public abstract class Config<T> implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String configName;
private String label;
// standard getters and setters for the above fields.
public abstract void setConfigValue(T value);
public abstract T getConfigValue();
}
@Entity
public class BooleanConfig extends Config<Boolean>{
private Boolean configValue;
public void setConfigValue(Boolean configValue){
this.configValue = configValue;
}
public Boolean getConfigValue(){
return this.configValue;
}
}
@Entity
public StringConfig extends Config<String>{
private String configValue;
public void setConfigValue(String configValue){
this.configValue = configValue;
}
public String getConfigValue(){
return this.configValue;
}
}
@Entity
public IntegerConfig extends Config<Integer>{
// and similar as the other two but with Integer.
}
我的persistence.xml中列出了所有这些类,当我从Eclipse运行应用程序进行调试时,一切都按预期工作,并按照我的预期编写和编辑值。我的问题是我编译war文件并将其上传到Tomcat。当webapp部署到Tomcat时,在数据库导致应用程序启动期间出现错误。
SchemaManagementException: Schema-validation: wrong column type encountered in column [configValue] in table [registry]; found [varchar (Types#VARCHAR)], but expecting [bit (Types#BOOLEAN)]
现在我认为问题的答案是我需要进入每个扩展类并将configValue列映射到特定的数据类型。我的问题是为什么从IDE运行时我没有收到异常?
答案 0 :(得分:0)
好的,我显然已经解决了这个问题,完全忘记了我发布了这个问题。所以这就是我做错了什么。问题主要来自扩展类configValue
的处理。这里的每一个都使用自己的类型,但数据库要求类型为varchar(255)
。一旦我以{:1>的形式为configValue
提供了列定义。
@Column(columnDefinition = 'varchar(255)')
private Integer configValue; // this could be for all the types listed in the question.
问题解决了。至于它在Eclipse中调试时没有显示出来的原因,我仍然不确定,但是这个修复在调试期间没有引起任何问题,并在部署期间解决了问题。我自己并没有弄清楚这一点,但我不记得是谁帮助了我。