слишком длинный идентификатор оракула ORA-00972

Я застрял с этой проблемой. Схема базы данных предоставлена кем-то другим, поэтому я не могу просто поменять имена. Я пытался добавить везде правильные аннотации, может быть, я что-то упускаю (очевидное)?

Вот мое полное отображение (довольно много классов), я опущу getter / setters.

Проблема в том, когда hibernate пытается получить все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 Вопрос здесь в том, можно ли как-то получить EntityControlRuleAttribType отControlRuleAttrib? Как вы можете видеть нижеControlRuleAttribTypeId это идентификаторControleRuleAttribType, Я хотел бы получить целое число объекта и целое число.

@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

Вот трассировка стека:

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() метод объявлен так:

@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;
}

И запрос гибернации:

https://gist.github.com/c8584113522757a4e0d8/4f31dc03e7e842eef693fa7ba928e19d27b3ca26

Помогите, пожалуйста :)

EDIT 2

Хорошо прочитав ответ @Jens, я сделал некоторые изменения в коде. Сначала я сделал, как вы написали, и это дало ошибку:

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

Я думаю, это правильно, так как у меня есть составной первичный ключ.

Тогда я попробовал это так:

@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;

Довольно близко, но это дает мне следующее исключение:

Repeated column in mapping for collection..

Итак, наконец я удалил

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=?.

Могу ли я заставить его работать? : /

Ответы на вопрос(3)

Ваш ответ на вопрос