gpt4 book ai didi

java - Hibernate 验证错误的实体外键

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:17 25 4
gpt4 key购买 nike

当 Hibernate 的 EntityManager 启动并验证实体映射时,我遇到了问题。用我可以起草的最简单的术语来说,我有以下四个类别:

@Entity
@Table(name="abc_rule")
public class Rule {
@Id
@Column(name="id")
private Integer id;

@ManyToOne
private RuleType ruleType;
}

@Entity
@Table(name="abc_rule_type")
@IdClass(RuleTypeKey.class)
public class RuleType {
@Id
private String typeCode;

@Id
private String otherCode;

@Column(name="descr")
private String description;
}

public class RuleTypeKey {
@Id
@Column(name="type_cd")
private String typeCode;

@Id
@Column(name="other_cd")
private String otherCode;
}

@Entity
@Table(name="abc_rule_type")
public class RuleTypeSimple {

@Id
@Column(name="id")
private Integer id;

@Column(name="type_cd")
private String typeCode;

@Column(name="other_cd")
private String otherCode;

@Column(name="descr")
private String description;
}

当 Hibernate 启动时,出现以下异常:

Foreign key (FK4AD4C4B924F958E2:abc_rule [ruleType_type_cd,ruleType_other_cd])) must have same number of columns as the referenced primary key (abc_rule_type [id])

如果我暂时将 RuleTypeSimple 上的 @Table 注释重命名为 "abc_rule_type_123",则 Hibernate 将按预期验证并使用映射。对我来说,这看起来 Hibernate 正在根据表名称而不是所引用的实际类的设置来验证外键映射。

这里是否有一些明显的东西我遗漏了,这将迫使 Hibernate 基于类进行验证?或者让它甚至不验证外键并只是相信我做对了?

顺便说一句,我知道没有充分的理由让类使用两个不同的标识符设置映射两次。就我而言,这是由于合并了作用于同一数据库的两个不同项目的代码而导致的。一个以只读方式使用,因此可以摆脱这种不寻常的映射。不幸的是,这两个代码库都有大量代码围绕着它们的类版本,重构将是一项艰巨的任务,我希望暂时可以避免。

最佳答案

请记住,Hibernate 是一个 ORM 工具,因此,您应该尝试通过遵循一些 OOP 规则或最佳实践来利用它。

根本不应该使用多个列作为主键,如果您完全被迫这样做(例如,如果您不这样做,就会有人杀了您,或者您已经创建了一个古老的关系数据库,并且超出了您的人类限制),那么您应该使用带有 @EmbeddedId 注释的 @Embedable Id,并且不要使用 @Id 注释来注释每一列

这是一个 EmbeddedId 示例:EmbeddedCompoundPrimaryKey Example

同时,我不确定您打算创建的模型是什么(至少如果您发布图表或表格脚本会有帮助),但通过此更正,它不应该给您带来更多错误:

@Entity
@Table(name="abc_rule")
public class Rule {
@Id
@Column(name="id")
private Integer id;

@ManyToOne
private RuleType ruleType;
}

@Entity
@Table(name="abc_rule_type")
//@IdClass(RuleTypeKey.class) <--I don't think this is right
public class RuleType {
@EmbeddedId //Add this
private RuleTypeKey id; //And this
/* Remove this
@Id
private String typeCode;

@Id
private String otherCode;*/

@Column(name="descr")
private String description;
}

@Embeddable //Add this
public class RuleTypeKey {
//@Id <--remove this
@Column(name="type_cd")
private String typeCode;

//@Id <--remove this
@Column(name="other_cd")
private String otherCode;
}

@Entity
//@Table(name="abc_rule_type") <--must be different table name
@Table(name="abc_rule_type_simple")
public class RuleTypeSimple {

@Id
@Column(name="id")
private Integer id;

@Column(name="type_cd") //Are this two colums a reference to
private String typeCode; //The RuleType too?? if so the must be
//The same as in class Rule (ManyToOne)

@Column(name="other_cd")
private String otherCode;

@Column(name="descr")
private String description;
}

尝试一下并让我知道它是否有效(它可能有一些语法错误,请检查它)

关于java - Hibernate 验证错误的实体外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11870787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com