【问题标题】:hbm2ddl ignores @Column annotation?hbm2ddl 忽略 @Column 注释?
【发布时间】:2012-07-16 11:30:15
【问题描述】:

为什么 hbm2ddl 会忽略 @Column 注释?

这是我的课:-

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "BASETEMPLATE")
public class BaseTemplate implements IBaseTemplate
{
    private Integer id;

    @Column(name="TEMPLATENAME")    
    private String templateName;

    @Column(name="BASETEMPLATEID")  
    private Integer baseTemplateId;

    @Id 
    @GeneratedValue 
    @Column(name = "TEMPLATEID")
    @Override
    /** {@inheritDoc} */
    public Integer getId() { return id; }       
...
}

hbm2dll 生成这个(sqlserver)表

dbo.BASETEMPLATE 
(
TEMPLATEID      int
templateName    varchar(255)
baseTemplateId  int
)

方言是 org.hibernate.dialect.SQLServerDialect 奇怪的是,主键总是正确创建的?

【问题讨论】:

  • 你希望生成什么样的表结构?我看到 3 个 @Column 注释(带有名称)和 3 个具有相同名称的 DB 表列。看起来它对我有用。
  • 我希望大小写匹配(我正在移植到区分大小写的数据库),但是即使列名完全不同,这也不起作用。
  • 对不起,我什至没有注意到大小写差异,哎呀,我的错。

标签: hibernate hbm2ddl


【解决方案1】:

我不知道为什么 hbm2ddl 会忽略字段上的 @Column,但我发现如果您对 getter 进行注释,它会正确设置表中的列名。

【讨论】:

    【解决方案2】:

    当你在 getter 上放置注解时,Hibernate 使用属性访问策略,当你将它们放置在字段上时,Hibernate 使用字段访问策略。但是,您不应该在同一个实体中(或者更准确地说,在同一个继承层次结构中)混合这些策略,除非您使用 @Access 对访问策略进行细粒度控制。

    默认情况下,Hibernate 期望以与 @Id 相同的方式放置注释,因此在您的情况下,它期望在 getter 上添加注释。

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 2016-05-22
      • 2021-05-11
      • 2011-11-13
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多