hibernate oracle identifier é muito longo ORA-00972

Estou preso com esse problema. O esquema do banco de dados é fornecido por outra pessoa, então não posso simplesmente mudar de nome. Eu tentei adicionar em todos os lugares anotações adequadas, talvez eu esteja faltando alguma coisa (óbvio)?

Aqui está o meu mapeamento completo (muitas classes), vou omitir getter / setters.

O problema é quando o hibernate está tentando obter tudoList<ControlRuleAttrib> controlRuleAttribs

Regra de Controle

@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 Pergunta aqui é, é possível de alguma forma obter EntidadeControlRuleAttribType deControlRuleAttrib? Como você pode ver abaixoControlRuleAttribTypeId é o id deControleRuleAttribType. Eu gostaria de obter inteiro objeto e de inteiro.

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

EDITAR

Aqui está o stacktrace:

https://gist.github.com/a30dd9ce534d96bb9a97

Como você descobrirá, falha aqui:

em com.execon.controllers.main.MainPageController.getMainPage (MainPageController.java:33) [classes:]

e é isso:

List<ControlRule> list = SessionFactoryUtils.openSession(
    sessionFactory ).createQuery( "from ControlRule" ).list();
System.out.println( list );

cada objeto que mapeamento eu adicionei, temtoString() método declarado assim:

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

E o pedido de hibernação:

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

Ajuda por favor :)

EDIT 2

Bem, depois de ler a resposta de @Jens, fiz algumas alterações no código. Primeiro fiz o que você escreveu e deu erro:

org.hibernate.AnnotationException: Uma chave estrangeira referindo com.execon.models.controlrules.ControlRuleAttrib de com.execon.models.controlrules.ControlRule tem o número errado de coluna. deve ser 3

Eu acho que isso é certo, como eu tenho chave primária composta.

Então eu tentei assim:

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

Muito perto, mas me dá a seguinte exceção:

Coluna repetida no mapeamento para coleta.

Então, finalmente eu removi

joinColumns = 
{
    @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
}

E tudo compilado exceto que quando tento chegar a coleção, o Hibernate está fazendo a seguinte consulta:

https://gist.github.com/c88684392f0b7a62bea5

A última linha écontrolrul0_.CONTROL_RULE_CONTROL_RULE_ID=? enquanto deveria sercontrolrul0_.CONTROL_RULE_ID=?.

Existe alguma maneira que eu possa fazer isso funcionar? : /

questionAnswers(3)

yourAnswerToTheQuestion