【问题标题】:How to create foreign key in Hibernate on Integer column如何在 Hibernate 中的 Integer 列上创建外键
【发布时间】:2011-03-18 11:57:15
【问题描述】:

我有一个 Java 实体,我希望 Hibernate 从整数字段创建外键(因为我没有对象引用):

@Entity
public class Invoice {

    ...
    @Column(nullable = true)
    private Integer generatedBy;
    ...

我想我想用一个属性做这样的事情:

    @ForeignKey(name="FK_Invoice_GeneratedBy", references="UserTable.UserId")
    @Column(nullable = true)
    private Integer generatedBy;

实现这一目标的最佳方法是什么?我最好不必在单独的文件中维护这些关系(如果可能的话)。

【问题讨论】:

  • 只是一个问题:你没有参考用户的原因是什么?
  • 可能有多种原因。例如 1)性能原因(我不想“吸收”太多信息)或 2)它是数据库中的一个表,它没有由我系统中的实体表示(或者我无法控制它)......但对我来说,它主要是nr。 1
  • 1.) 延迟加载 2.) 如果没有实体表示,为什么需要 hibernate 知道外键约束?
  • 1) 延迟加载使其更慢。问题是我需要通过 Web 服务边界返回这些实体,这会导致整个对象层次结构具体化。这导致了严重的性能问题。 2)我想保持数据库的完整性,我真的不需要它来用于 Hibernate,但确实发现它是存储它靠近类/字段定义的最佳位置。
  • 1) 好吧,如果您通过 Web 服务传输实体,我强烈建议您使用数据传输对象模式,并且延迟加载不再是问题(即使您传输分离的实体,您不需要初始化所有未加载的关联,访问它们将“只是”导致异常)。 2)可以直接在数据库中声明外键约束。我也不建议依靠 Hibernate 来维护数据库结构。如果只是给程序员的信息,请添加评论。

标签: java hibernate foreign-keys


【解决方案1】:

似乎没有解决方案,因此接受这个作为答案。

【讨论】:

    【解决方案2】:

    有办法做到,但不是很好...

    你可以让你的整数属性和对象属性以这种方式映射:

    @Column(ame = "GENERATED_BY", nullable = true)
    private Integer generatedBy;
    
    @ForeignKey(name="FK_Invoice_GeneratedBy")
    @JoinColumn(name = "GENERATED_BY", nullable = false, updatable = false, insertable = false)
    private User generatedByUser;
    

    您可以不保留对您的 generatedByUser 字段的外部访问权限,它只会显示 hibernate 存在关系。您可以随意设置 Integer 字段,当您稍后从 DB 加载此对象时,您将拥有您的用户参考。

    同样,不是很漂亮,但有时会很有用。

    【讨论】:

    • 我实际上更希望 User 对象不会被加载。我尝试了您推荐的方法,但得到了 DDL 的可疑输出:...,generateBy integer,generateByUser varchar(255) 用于位数据,
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多