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

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

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

Проблема в том, что когда 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 < ControlRuleAttrib > controlRuleAttribs;
}

ControlRuleAttrib

@Table(name = "CONTROL_RULE_ATTRIB")
@Entity
public class ControlRuleAttrib {
 @EmbeddedId
 private ControlRuleAttribPK controlRuleAttribPK;

 @Column(name = "ATTRIBUTE_VALUE")
 private String attributeValue;
}

ControleRuleAttribPK Вопрос в том, можно ли как-то получить Entity ControlRuleAttribTypeиз 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;
}

Контролерулеаттрибтипе

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

Тип РулеКонтроля

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

РЕДАКТИРОВАТЬ

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

https://gist.github.com/a30dd9ce534d96bb9a97

Как вы узнаете, здесь это не работает:

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

И запрос на спящий режим:

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

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

РЕДАКТИРОВАТЬ 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 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=?.

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

5
задан Draken 26 July 2016 в 12:39
поделиться