hibernate, oracle identificateur est trop long ORA-00972

Im coincé avec ce problème. Le schéma de base de données est fourni par quelqu'un d'autre donc je ne peux pas tout simplement changer de nom. J'ai essayé d'ajouter partout bon annotations, peut-être que je suis absent quelque chose (évident)?

Voici mon une cartographie complète (assez nombreux classess), je vais omettre de lecture/définition.

Le problème, c'est quand hibernate est d'essayer d'obtenir tous les List<ControlRuleAttrib> controlRuleAttribs

Controle De La Règle

@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
Ici la Question est, est-il possible d'obtenir en quelque sorte d'Entité ControlRuleAttribType de ControlRuleAttrib? Comme vous pouvez le voir ci-dessous ControlRuleAttribTypeId est l'id de ControleRuleAttribType. J'aimerais obtenir de l'ensemble de l'objet isteand de entier.

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

MODIFIER

Ici est stacktrace:

https://gist.github.com/a30dd9ce534d96bb9a97

Comme vous allez le savoir, il échoue ici:

à
com.execon.les contrôleurs.principal.MainPageController.getMainPage(MainPageController.java:33)
[classes]

et ce que c'est:

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

chaque objet qui la cartographie, j'ai ajouté, a toString() méthode déclarée comme ceci:

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

Et mise en veille prolongée, à la demande:

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

Aider s'il vous plaît 🙂

EDIT 2

Bien après la lecture de @Jens réponse, j'ai fait quelques modifications dans le code. J'ai d'abord fait comme vous l'avez écrit et il a donné d'erreur:

org.mise en veille prolongée.AnnotationException: Une clé Étrangère qui fait référence
com.execon.modèles.controlrules.ControlRuleAttrib de
com.execon.modèles.controlrules.ControlRule a le mauvais numéro de
la colonne. devrait être de 3

Je suppose que c'est juste, comme je l'ai clé primaire composite.

Ensuite, j'ai essayé de cette façon:

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

Très proches, mais il me donne l'exception suivante:

Répétées de la colonne dans la cartographie pour la collection..

Donc finalement je l'ai enlevé

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

Et tout compilé sauf que quand j'essaie d'atteindre la collecte, mise en veille prolongée est en train de faire requête suivante:

https://gist.github.com/c88684392f0b7a62bea5

La dernière ligne, est controlrul0_.CONTROL_RULE_CONTROL_RULE_ID=? alors qu'il devrait être controlrul0_.CONTROL_RULE_ID=?.

Est-il de toute façon je peux le faire fonctionner? :/

OriginalL'auteur kamil | 2012-07-10