hibernate oracle identifier is too long ORA-00972
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!
kamil
Updated on July 02, 2022Comments
-
kamil almost 2 years
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
fromControlRuleAttrib
? As you can see belowControlRuleAttribTypeId
is the id ofControleRuleAttribType
. 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 becontrolrul0_.CONTROL_RULE_ID=?
.Is there anyway I can make it work? :/