hibernate oracle标识符太长ORA-00972
我坚持这个问题。 数据库架构由其他人提供,因此我无法简单地更改名称。 我尝试在任何地方添加适当的注释,也许我错过了一些东西(显而易见)?
这是我的完整映射(很多classess),我将省略getter / setter。
问题是当hibernate试图获取所有List controlRuleAttribs
控制规则
@Entity @Table(name = "CONTROL_RULE") public class ControlRule implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "CONTROL_RULE_ID") private Long id; @ManyToOne(fetch = FetchType.LAZY) @Cascade(CascadeType.ALL) @JoinColumn(name = "CONTROL_RULE_TYPE_ID") @ForeignKey(name = "CONTROL_RULE_TYPE_ID") private ControlRuleType controlRuleType; @Column(name = "JOB_NM") private String jobname; @Column(name = "LIBRARY_NM") private String libraryname; @Column(name = "TABLE_NM") private String tablename; @Column(name = "COLUMN_NM") private String columnname; @OneToMany(fetch = FetchType.LAZY) @Cascade(CascadeType.ALL) @JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = { @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false) }) private List controlRuleAttribs; }
ControlRuleAttrib
@Table(name = "CONTROL_RULE_ATTRIB") @Entity public class ControlRuleAttrib { @EmbeddedId private ControlRuleAttribPK controlRuleAttribPK; @Column(name = "ATTRIBUTE_VALUE") private String attributeValue; }
ControleRuleAttribPK这里的问题是,是否有可能以某种方式从ControlRuleAttrib
获取Entity ControlRuleAttrib
? 如下所示, ControlRuleAttribTypeId
是ControleRuleAttribType
的id。 我想得到整个对象isteand的整数。
@Embeddable public class ControlRuleAttribPK implements Serializable { @Column(name = "CONTROL_RULE_ID") private Long controlRuleId; @Column(name = "ATTRIBUTE_SEQ_NUM") private Integer attributeSeqNum; @Column(name = "CONTROL_RULE_ATTRIB_TYPE_ID") private Integer controlRuleAttribTypeId; }
ControleRuleAttribType
@Entity @Table(name = "CONTROL_RULE_ATTRIB_TYPE") public class ControlRuleAttribType implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "CONTROL_RULE_ATTRIB_TYPE_ID") private Integer id; @Column(name = "CONTROL_RULE_ATTRIB_TYPE_NM") private String typename; @Column(name = "CONTROL_RULE_ATTRIB_TYPE_DESC") private String typedesc; @ManyToOne(fetch = FetchType.LAZY) @Cascade(CascadeType.ALL) @JoinColumn(name = "CONTROL_RULE_TYPE_ID") @ForeignKey(name = "CONTROL_RULE_TYPE_ID") private ControlRuleType controlruletype; }
ControleRuleType
@Entity @Table(name = "CONTROL_RULE_TYPE") public class ControlRuleType implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "CONTROL_RULE_TYPE_ID") private Integer id; @Column(name = "CONTROL_RULE_TYPE_NM") private String typename; @Column(name = "CONTROL_RULE_TYPE_DESC") private String typedesc; }
编辑
这是stacktrace:
https://gist.github.com/a30dd9ce534d96bb9a97
你会发现,它失败了:
在com.execon.controllers.main.MainPageController.getMainPage(MainPageController.java:33)[classes:]
这就是:
List list = SessionFactoryUtils.openSession( sessionFactory ).createQuery( "from ControlRule" ).list(); System.out.println( list );
我添加的映射的每个对象都有toString()
方法声明如下:
@Override public String toString() { String s = "ControlRule{"; s += "id=" + id.toString(); s += ", controlRuleType=" + controlRuleType; s += ", jobname='" + jobname + '\''; s += ", libraryname='" + libraryname + '\''; s += ", tablename='" + tablename + '\''; s += ", columnname='" + columnname + '\''; s += ", controlRuleAttribs=" + controlRuleAttribs; s += '}'; return s; }
和hibernate请求:
https://gist.github.com/c8584113522757a4e0d8/4f31dc03e7e842eef693fa7ba928e19d27b3ca26
请帮忙 :)
编辑2
在阅读@Jens回答后,我对代码进行了一些更改。 首先,我按你的意思写了,它给出了错误:
org.hibernate.AnnotationException:从com.execon.models.controlrules.ControlRule引用com.execon.models.controlrules.ControlRuleAttrib的外键具有错误的列数。 应该是3
我想这是对的,因为我有复合主键。
然后我这样试了:
@OneToMany(fetch = FetchType.LAZY) @Cascade(CascadeType.ALL) @JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = { @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false), @JoinColumn(name = "CONTROL_RULE_ATTRIB_TYPE_ID", nullable = false, updatable = false), @JoinColumn(name = "ATTRIBUTE_SEQ_NUM", nullable = false, updatable = false) }) private List controlRuleAttribs;
很接近,但它给了我以下例外:
映射中的重复列用于收集..
所以最后我删除了
joinColumns = { @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false) }
除了当我试图达到集合时,Hibernate正在进行以下查询:
https://gist.github.com/c88684392f0b7a62bea5
最后一行是controlrul0_.CONTROL_RULE_CONTROL_RULE_ID=?
虽然它应该是controlrul0_.CONTROL_RULE_ID=?
。
无论如何我能使它工作吗? :/
经过最近几个小时的努力,我终于让它在我的项目中工作了。 我做的是这样的:
ControlRule
@OneToMany(fetch = FetchType.LAZY, mappedBy = "controlRuleAttribPK.controlRuleId") @Cascade(CascadeType.ALL) private List controlRuleAttribs;
基本上指出集合应该使用复合主键中的controlRuleId。 到目前为止它的工作很棒!
我不清楚哪个标识符太长,但我可以建议您可以尝试将@Id
注释的字段类型从Integer
更改为Long
。 获得有关您的问题的详细信息(堆栈跟踪等)将会非常棒。
问题是专栏
CONTROL_RULE_ATTRIB.controlRuleAttribs_CONTROL_RULE_ATTRIB_TYPE_ID
这是多久,它不可能存在于您的数据库中。 我没有在问题中看到任何暗示它是如何实际命名的,但我假设正确的名字是
CONTROL_RULE_ATTRIB.CONTROL_RULE_ATTRIB_TYPE_ID
所以问题是:为什么hibernate试图访问这个列。 它所在的表是一个映射表,它在hibernate中映射为:
@OneToMany(fetch = FetchType.LAZY) @Cascade(CascadeType.ALL) @JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = {@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)}) private List controlRuleAttribs;
如果查看@JoinTable注释,您会注意到它定义了使用的表名和连接列。 但是映射表有两组连接列。 第二个未指定。 因此,使用您配置的NamingStrategy或未配置任何默认值的NamingStrategy。 只需使用属性inverseJoinColumns指定另一组连接列,所有都应该没问题。
完整注释应如下所示:
@JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = {@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)}, inverseJoinColumns = {@JoinColumn(name = "CONTROL_RULE_ATTRIB_TYPE_ID")})
注意:我不知道你是否需要该列上任何可以为空的可更新内容。
另请参阅JoinTable注释的文档
- 模式validation:缺少表
- Hibernate – 激活Bean Validation集成时出错
- 如何使用返回参数从Hibernate调用Oracle函数?
- 错误:不推荐使用PersistenceProvider,使用HibernatePersistenceProvider而不是HibernatePersistence
- H2不在我的Spring Boot应用程序中创建/更新表。 我的实体出了什么问题?
- Spring / Hibernate测试:在DDL创建后插入测试数据
- 除非访问集合,否则Hibernate OneToMany FetchType.LAZY无法正常工作?
- 2个JPA实体在同一个表中
- exception:NumberFormatException:对于JSP列表页面中的输入字符串