hibernate oracle标识符太长ORA-00972 [英] hibernate oracle identifier is too long ORA-00972
问题描述
这是我的完整映射(很多classess),我会省略getter / setters 。
问题是当hibernate试图获取所有 List< ControlRuleAttrib> controlRuleAttribs
控制规则
@Entity
@Table(name =CONTROL_RULE)
公共类ControlRule实现Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name =CONTROL_RULE_ID)
私人长ID;
@ManyToOne(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinColumn(name =CONTROL_RULE_TYPE_ID)
@ForeignKey(name =CONTROL_RULE_TYPE_ID)
私人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< ControlRuleAttrib> controlRuleAttribs;
ControlRuleAttrib $ b
@Table(name =CONTROL_RULE_ATTRIB)
@Entity
公共类ControlRuleAttrib {
@EmbeddedId
私有ControlRuleAttribPK controlRuleAttribPK;
@Column(name =ATTRIBUTE_VALUE)
private String attributeValue;
$ p $ ControleRuleAttribPK
这里的问题是,是否有可能以某种方式从 ControlRuleAttrib
获取实体 ControlRuleAttribType
?正如你可以在下面看到 ControlRuleAttribTypeId
是 ControleRuleAttribType
的id。我想得到整个对象的整数。
@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 $ b
@Entity
@Table(name =CONTROL_RULE_ATTRIB_TYPE)
public class ControlRuleAttribType implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name =CONTROL_RULE_ATTRIB_TYPE_ID)
私人整数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)
私人ControlRuleType controlruletype;
}
ControleRuleType $ b
@Entity
@Table(name =CONTROL_RULE_TYPE)
公共类ControlRuleType实现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;
}
编辑
以下是堆栈跟踪:
https ://gist.github.com/a30dd9ce534d96bb9a97
你会发现,它在这里失败:
at
com.execon.controllers.main.MainPageController.getMainPage(MainPageController.java:33)
[classes:]
就是这样:
List< ControlRule> list = SessionFactoryUtils.openSession(
sessionFactory).createQuery(from ControlRule).list();
System.out.println(list);
每个添加了映射的对象都有 toString()$ c
$ p $ @Override
public String toString()
{$ b>方法声明如下:
$ b 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.ControlRuleAttrib来自
com.execon.models.controlrules.ControlRule的
列号错误。应该是3
我想这是对的,因为我有复合主键。
$ p
$ b $ p $
@OneToMany(fetch = FetchType.LAZY)
@Cascade (CascadeType.ALL)
@JoinTable(name =CONTROL_RULE_ATTRIB,
joinColumns = {
@JoinColumn(name =CONTROL_RULE_ID,nullable = false,updatable = false)
},
@JoinColumn($ name =CONTROL_RULE_ID,nullable = false),
@JoinColumn(name =ATTRIBUTE_SEQ_NUM,nullable = false,updatable = false)
})
private List< ControlRuleAttrib> controlRuleAttribs;
非常接近,但它给了我以下例外:
为集合映射重复列。
所以最后我删除了
joinColumns =
{
@JoinColumn(name =CONTROL_RULE_ID,nullable = false,updatable = false)
$ b $ p
$ b 除了当我尝试访问集合时,Hibernate正在执行以下查询:
https://gist.github.com/c88684392f0b7a62bea5
最后一行是 controlrul0_.CONTROL_RULE_CONTROL_RULE_ID =?
,而它应该是 controlrul0_.CONTROL_RULE_ID =?
。
有什么方法可以让它工作? :/ b>
解决方案
经过最近几个小时的努力之后,我终于使其在我的项目中工作。我做的事情是这样的:
ControlRule
@OneToMany(fetch = FetchType.LAZY,mappedBy =controlRuleAttribPK.controlRuleId)
@Cascade(CascadeType.ALL)
private List< ControlRuleAttrib> controlRuleAttribs;
基本上指出集合应该使用复合主键的controlRuleId。到目前为止它的工作非常棒!
Im stuck with this problem. The database schema is provided by someone else so I cant simply change names. I tried add everywhere proper annotations, maybe I'm missing something (obvious)?
Here is my full mapping (quite many classess), I'll ommit getter/setters.
The problem is when hibernate is trying to get all List<ControlRuleAttrib> controlRuleAttribs
Controle Rule
@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 < ControlRuleAttrib > controlRuleAttribs;
}
ControlRuleAttrib
@Table(name = "CONTROL_RULE_ATTRIB")
@Entity
public class ControlRuleAttrib {
@EmbeddedId
private ControlRuleAttribPK controlRuleAttribPK;
@Column(name = "ATTRIBUTE_VALUE")
private String attributeValue;
}
ControleRuleAttribPK
Question here is, is it possible to somehow get Entity ControlRuleAttribType
from ControlRuleAttrib
? As you can see below ControlRuleAttribTypeId
is the id of ControleRuleAttribType
. I'd like to get whole object isteand of integer.
@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;
}
EDIT
Here is stacktrace:
https://gist.github.com/a30dd9ce534d96bb9a97
As you'll find out, it fails here:
at
com.execon.controllers.main.MainPageController.getMainPage(MainPageController.java:33)
[classes:]
and this is it:
List<ControlRule> list = SessionFactoryUtils.openSession(
sessionFactory ).createQuery( "from ControlRule" ).list();
System.out.println( list );
every object which mapping I added, has toString()
method declared like this:
@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;
}
And hibernate request:
https://gist.github.com/c8584113522757a4e0d8/4f31dc03e7e842eef693fa7ba928e19d27b3ca26
Help please :)
EDIT 2
Well after reading @Jens answer, I did some changes in the code. First I did as you wrote and it gave error:
org.hibernate.AnnotationException: A Foreign key refering
com.execon.models.controlrules.ControlRuleAttrib from
com.execon.models.controlrules.ControlRule has the wrong number of
column. should be 3
I guess this is right, as I have composite primary key.
Then I tried it this way:
@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<ControlRuleAttrib> controlRuleAttribs;
Quite close but it gives me the following exception:
Repeated column in mapping for collection..
So finally I removed
joinColumns =
{
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
}
And everything compiled except that when I try to reach collection, Hibernate is doing following query:
https://gist.github.com/c88684392f0b7a62bea5
The last line, is controlrul0_.CONTROL_RULE_CONTROL_RULE_ID=?
while it should be controlrul0_.CONTROL_RULE_ID=?
.
Is there anyway I can make it work? :/
解决方案 After struggling with this for last few hours I finally make it working within my project. The thing I did was this:
ControlRule
@OneToMany(fetch = FetchType.LAZY, mappedBy = "controlRuleAttribPK.controlRuleId")
@Cascade(CascadeType.ALL)
private List<ControlRuleAttrib> controlRuleAttribs;
Basically pointing that the collection should use controlRuleId from composite primary key. So far its working great!
这篇关于hibernate oracle标识符太长ORA-00972的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!