【问题标题】:How to use Hibernate @Index annotation properly? [duplicate]如何正确使用 Hibernate @Index 注解? [复制]
【发布时间】:2011-10-01 18:48:31
【问题描述】:

我有一个 java 类用作实体,它有 2 个继承自它的类。这个类有一些索引,但这些索引没有出现在数据库中。这是我的java超类代码

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.persistence.Version;
import javax.persistence.OneToMany;
import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="service", uniqueConstraints = {@UniqueConstraint(columnNames={"name"})})
@org.hibernate.annotations.Table(appliesTo = "service", 
                                 indexes = { @Index(name = "service_name", columnNames = { "name" }), 
                                 @Index(name = "service_description", columnNames = { "description" }),
                                 @Index(name = "service_accessNumber", columnNames = { "access_number" })   
                     })
public class Service implements Serializable {

@Column(name="access_number",length = 95,nullable=false)
    String accessNumber;

@Column(length=80,nullable=false)
    String name;

@Column(length=140)
    String description;

}

有谁知道我的问题是什么 注意:我的所有 java 类都有这个问题,但这是其中之一。所有类的代码都是这样的

编辑:我构建了一个xml文件并将其放入一个grails项目中,当我运行这个项目时,创建了数据库

【问题讨论】:

    标签: java hibernate grails indices


    【解决方案1】:

    单个@Table 注释会起作用吗?我还没有尝试过,我猜 Hibernate @Table 可能会被 JPA @Table 覆盖。

    您也可以在列字段上尝试@Index 注释:

    public class Service implements Serializable {
        @Index(name="service_accessnumber")
        @Column(name="access_number",length = 95,nullable=false)
        String accessNumber;
    
        @Index(name="service_name")
        @Column(length=80,nullable=false)
        String name;
    
        @Index(name="service_description")
        @Column(length=140)
        String description;
    }
    

    【讨论】:

    • hibernate 是否尝试重新创建表?即,您是否设置了 hibernate.hbm2ddl.auto = create-drop?
    • 我删除了数据库并应用了 create-drop,但问题没有解决。出现数据库中没有索引
    • 我正在使用 PostgreSQL,我相信这对我有用。由于 Service 在您的情况下是一个超类,您使用什么 @Inheritance 策略?映射超类将不起作用,因为每个索引名称只会创建一个索引。另请参阅How to auto generate names for @Index annotation
    • 而且,您是否尝试删除所有 @Table 注释?当@Table 存在时,休眠可能会忽略所有@Index-es?唯一约束可以通过在 name 列上注释 @NaturalId 来指定。
    • 我尝试删除@Table 注释,但问题没有解决
    【解决方案2】:

    我有同样的问题,但我找到了它的解决方案,我试试看效果很好,它可能对你有帮助

    in your DataSource.groovy file in your grails project make sure that under 
    environment dbCreate is not equal to "update": if it is equal to "update", change 
    it to "create".
    

    效果很好,试试吧

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2013-07-07
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多