java – Hibernate @MapKeyColumn和表继承导致Unknown列类型异常

前端之家收集整理的这篇文章主要介绍了java – Hibernate @MapKeyColumn和表继承导致Unknown列类型异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我从hibernate升级4.2.5.Final到4.3.6.Final,4.3.6 hibernate libs导致 mysql未知列类型异常.以下课程已被简化,因为我无法全面显示我的公司生产代码.
  1. @Entity
  2. @Table(name = "area")
  3. public class Area {
  4. private Integer id;
  5. private Map<BasicType,BasicConfiguration> configurationsMap =
  6. new HashMap<BasicType,BasicConfiguration>();
  7.  
  8. @Id
  9. @GeneratedValue(strategy = GenerationType.IDENTITY)
  10. public Integer getId() {
  11. return id;
  12. }
  13.  
  14. public void setId(Integer id) {
  15. this.id = id;
  16. }
  17.  
  18. @OneToMany(fetch = FetchType.EAGER,cascade = {CascadeType.ALL},orphanRemoval = true)
  19. @JoinTable(name = "area_configuration",joinColumns = {@JoinColumn(name = "area_id")},inverseJoinColumns = {@JoinColumn(name = "basic_configuration_id")})
  20. @MapKeyEnumerated(EnumType.STRING)
  21. @MapKeyColumn(name = "type")
  22. public Map<BasicType,BasicConfiguration> getConfigurationsMap () {
  23. return configurationsMap;
  24. }

BasicType只是一个枚举

  1. public enum BasicType {
  2. TYPE1,TYPE2,TYPE3,TYPE4,TYPE5;
  3. }

而基本配置是:

  1. @Entity
  2. @Table(name = "basic_configuration")
  3. @Inheritance(strategy = InheritanceType.JOINED)
  4. @DiscriminatorColumn(name = "type",discriminatorType = DiscriminatorType.STRING)
  5. public abstract class BasicConfiguration {
  6.  
  7. private Integer id;
  8.  
  9. @Id
  10. @GeneratedValue(strategy = GenerationType.IDENTITY)
  11. public Integer getId() {
  12. return id;
  13. }
  14.  
  15. public void setId(Integer id) {
  16. this.id = id;
  17. }
  18. }

我有一个测试,试图持续一个区域对象到一个MysqL数据库,产生以下错误

  1. **Caused by: com.MysqL.jdbc.exceptions.jdbc4.MysqLSyntaxErrorException: Unknown column 'type' in 'field list'**
  2. at sun.reflect.GeneratedConstructorAccessor73.newInstance(Unknown Source)
  3. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  4.  
  5. at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
  6. at com.MysqL.jdbc.Util.handleNewInstance(Util.java:408)
  7. at com.MysqL.jd

生成的hibernate代码显示它正在尝试将类型值插入到basic_configuration表中,而不是area_configuration表中:

  1. **Hibernate: insert into basic_configuration (entity_version,type) values (?,TYPE1)**
  2. Tests run: 9,Failures: 0,Errors: 9,Skipped: 0,Time elapsed: 0.208 sec <<< FAILURE! -
  3. javax.persistence.PersistenceException: org.hibernate.exception.sqlGrammarException: could not execute statement
  4. at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
  5. at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
  6. at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316)
  7. at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:881)
  8. at sun.reflect.Ge

这个错误似乎已经在hibernate 4.2.9中引入了.Final起始,4.2.9以下的版本.Final似乎没有这个问题,有人知道我该如何解决这个问题?非常感谢.

解决方法

我记得有一个类似的问题.在这里查看你的代码
  1. @Entity
  2. @Table(name = "basic_configuration")
  3. @Inheritance(strategy = InheritanceType.JOINED)
  4. @DiscriminatorColumn(name = "type",discriminatorType = DiscriminatorType.STRING)
  5. public abstract class BasicConfiguration {
  6.  
  7. private Integer id;
  8.  
  9. @Id
  10. @GeneratedValue(strategy = GenerationType.IDENTITY)
  11. public Integer getId() {
  12. return id;
  13. }
  14.  
  15. public void setId(Integer id) {
  16. this.id = id;
  17. }
  18. }

在这一行 – >

  1. @DiscriminatorColumn(name = "type",discriminatorType = DiscriminatorType.STRING)

您正在使用sql保留字,“like”.查看此列表:

Reserved words

猜你在找的Java相关文章