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
Vous devez vous connecter pour publier un commentaire.
Après avoir lutté avec ce dernier quelques heures, j'ai enfin faire de travail au sein de mon projet. La chose que j'ai fait c'était ça:
ControlRule
Fondamentalement, en soulignant que la collection doit utiliser controlRuleId de clé primaire composite. Jusqu'à présent, son travail une grande!
OriginalL'auteur kamil
Je n'ai pas de comprendre clairement ce qui identificateur est trop long, mais je peux proposer que vous pouvez essayer de modifier
@Id
annoté types de champ à partir deInteger
àLong
. Et ce sera formidable pour obtenir quelques renseignements détaillés (trace de la pile, etc.) à propos de votre problème.Donc, vous avez d'erreur Oracle
ORA-00972
. Il est décrit ici. Le problème, c'est long DB noms d'objet, donc la seule solution que je propose de raccourcir les noms. Peut-être JPA fournisseur génère de très longues alias, mais je pense que cette situation est presque impossible (même si les alias sont pris en compte).C'est le problème :/ Im écrire des trucs pour la société qui nous fournit son propre schéma de données et je ne peux rien faire avec des noms d'objets
Ooops!.. Je n'ai pas remarqué votre hibernate journal. Vous pouvez y sélectionner ... ,controlrul0_.controlRuleAttribs_CONTROL_RULE_attrib_type_id comme controlR3_1_ , ... à partir de CONTROL_RULE_ATTRIB controlrul0_ inner join .... controlRuleAttribs_CONTROL_RULE_attrib_type_id semble ne pas être valide nom de la colonne. Donc, le problème est dans
@JoinTable
. Vous pouvez essayer de mettrereferencedColumnName
attribut@JoinColumn
annotation. Autre chose que vous pouvez parcourir ceciOriginalL'auteur gkuzmin
Le problème, c'est la colonne
Qui est tellement longue qu'il ne peut pas exister dans votre base de données. Je ne vois pas dans la question de tout soupçon comment il est effectivement nommé, mais je suis en supposant que le nom propre est
Donc la question est: Pourquoi est-hibernate essayant d'accéder à cette colonne. La table est une table de correspondance qui est mappé en veille prolongée:
Si vous regardez l' @JoinTable d'annotation, vous remarquerez que c'définit le nom de la table comme il est utilisé et une colonne de jointure. Mais une table de correspondance a deux ensembles de colonnes de jointure. La deuxième n'est pas spécifié. Par conséquent, la NamingStrategy vous avez configuré ou si vous n'avez pas configuré de toute la valeur par défaut est utilisé. Il suffit de spécifier l'autre ensemble de colonnes de jointure à l'aide de l'attribut inverseJoinColumns et tout doit être beau.
L'annotation complète devrait ressembler à:
Remarque: je n'ai aucune idée si vous avez besoin de la nullable, pouvant être mis à jour choses sur cette colonne.
Voir aussi la la documentation de la JoinTable annotation
OriginalL'auteur Jens Schauder