当前位置: 首页 > 面试题库 >

休眠oracle标识符太长ORA-00972

晁开宇
2023-03-14
问题内容

我陷入了这个问题。数据库架构是由其他人提供的,因此我不能简单地更改名称。我尝试在各处添加适当的注释,也许我遗漏了一些(显而易见的)?

这是我的完整映射(很多类),我将省略getter / setter。

问题是当冬眠试图获得全部 List<ControlRuleAttrib> 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
这里的问题是,是否有可能以某种方式得到实体ControlRuleAttribTypeControlRuleAttrib?如您所见,以下ControlRuleAttribTypeId是的ID
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;
}

编辑

这是stacktrace:

https://gist.github.com/a30dd9ce534d96bb9a97

您会发现,它在这里失败:

在com.execon.controllers.main.MainPageController.getMainPage(MainPageController.java:33)上[类:]

就是这样:

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

请帮助 :)

编辑2

在阅读@Jens答案之后,我对代码做了一些更改。首先,我按照您的描述进行操作,但出现了错误:

org.hibernate.AnnotationException:从com.execon.models.controlrules.ControlRule引用com.execon.models.controlrules.ControlRuleAttrib的外键具有错误的列数。应该是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;

相当接近,但它给了我以下例外:

映射中重复的列用于收集。

所以最后我删除了

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

无论如何,我可以使它工作吗?:/


问题答案:

经过数小时的努力,我终于使它在我的项目中正常工作。我所做的是这样的:

控制规则

@OneToMany(fetch = FetchType.LAZY, mappedBy = "controlRuleAttribPK.controlRuleId")
@Cascade(CascadeType.ALL)
private List<ControlRuleAttrib> controlRuleAttribs;

基本上指出集合应该使用复合主键中的controlRuleId。到目前为止,它的工作很棒!



 类似资料:
  • 问题内容: 我陷入了这个问题。数据库架构是由其他人提供的,因此我不能简单地更改名称。我尝试在各处添加适当的注释,也许我遗漏了一些(显而易见的)? 这是我的完整映射(很多类),我将省略getter / setter。 问题是当hibernate试图获得全部 控制规则 ControlRuleAttrib ControleRuleAttribPK 这里的问题是,是否有可能以某种方式得到实体的?如您所见,

  • 我读过关于隐性策略的书,但不确定。你知道怎么解决这个问题吗?

  • 有人能帮我找出为什么这段代码返回一个SQLOracle ORA-00904:无效的索引符错误吗?查询在没有Country='阿根廷'的情况下有效,但我需要按此值向下过滤。有人能给我指出正确的方向吗?

  • 我正在进行SQL查询,但遇到了一个问题。 这就是查询。 这就是结果。 我不知道为什么“T1”在子查询中无效。

  • 问题内容: 我的数据库是Oracle,我的id列值是Oracle序列,此序列由触发器执行,因此,在插入每一行之前,此触发器使用此序列来获取id值。因此,我对应该在实体类中定义哪个id策略生成感到困惑。 要么 要么 真的很困惑,有人可以阐明这个话题吗?请清楚解释。 问题答案: 我还有一个projet,其中有一个Oracle DB将数据提供给我的@Entity类。如您所说,序列通过触发器生成表PK的I

  • 问题内容: 我正在尝试在我的员工实体中关联功能列表(可嵌入),H2对此表示不满,因为它期望使用“标识符” 由以下原因引起:org.h2.jdbc.JdbcSQLException:SQL语句中的语法错误“ CREATE TABLE EMPLOYEE_FUNCTIONS(EMPLOYEE_EMPLOYEEID VARCHAR(255)NOT NULL,ACTIVE BOOLEAN NOT NULL,