【问题标题】:Issues with using hbm2ddl in development environment在开发环境中使用 hbm2ddl 的问题
【发布时间】:2012-02-23 10:03:36
【问题描述】:

我正在使用hbm2ddl 通过在配置中包含这一行来自动创建架构:

<prop key="hibernate.hbm2ddl.auto">create</prop>

我有一个实体 bean 定义为:

@Entity
@Table(name = "user")
public class User {

    @Column(name = "firstname")
    private String firstName;

    @Column(name = "lastname")
    private String lastName;

    private String fullName;

}

有 3 个属性,我喜欢将前两个保存在数据库表中,并喜欢计算第三个。当我使用 create 选项运行 hbm2ddl 时,它会创建所有 3 列,尽管我在第三列上没有 @Column 注释。

如何防止 Hibernate 将最后一个属性创建为列?

【问题讨论】:

  • Hibernate 将始终为属性创建列,无论它们是否被注释为@Column。正如您所见,阻止这种情况的唯一方法是明确告诉 Hibernate 您要从映射中排除某个属性。

标签: hibernate hbm2ddl


【解决方案1】:

@Transient 肯定会阻止它。

【讨论】:

  • 我从未注释过全名,我什至尝试删除架构并重新创建它。 @Transient 成功了。谢谢
【解决方案2】:

@Column 注释并不意味着该字段将被持久化。它只是添加更多信息,例如用于模式生成器。

如果您不希望保留字段(并且仍然对实体使用字段访问权限),则应将其注释为 NimChimpsky 指出的 @Transient,或使用 Java transient 关键字。

【讨论】:

  • 以前从来没有注意到,我一定一直在不假思索地添加瞬态
  • @NimChimpsky 好吧,当然有一个问题,我们说的是什么版本的 Hibernate。也许在 Hibernate 兼容 JPA 之前,它的行为有所不同?至少 JPA 2.0 规范告诉我们关于持久字段的内容:“映射注释不得应用于transientTransient 的字段或属性。”“所有未使用Transient 注释的非transient 实例变量都是持久的。”
猜你喜欢
  • 2022-08-02
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多