Hibernate使用命名策略生成pk ID

时间:2012-06-05 20:19:50

标签: java hibernate

我正在使用Hibernate JPA。我想扩展一个包含我的pk生成器和一些hash等于代码的基类,但是我的公司正在使用table_name_id来描述物理数据库中的ID,这使得这看起来不可能。我刚刚被告知我可以使用hibernates命名策略动态地将表名称添加到我的变量中,但是我还没有找到一个很好的例子来说明如何实现这一点。有人能够指出一些关于如何实现这一目标的示例代码或文档。

@MappedSuperclass
public abstract class Base implements Serializable {

    @Id
    @GeneratedValue(strategy = AUTO)
    @Column(name="ID", nullable = false)
    private Integer id;

    ....
}

子类A

@Entity
@Table(name="TABLE_A")
public class TableA extends Base {
// physical model needs base pk id to be prefixed with table_a resulting in table_a_id.
...
}

B小组

@Entity
@Table(name="TABLE_B")
public class TableB extends Base {
// physical model needs base pk id to be prefixed with table_b resulting in table_b_id.
...
}

1 个答案:

答案 0 :(得分:1)

我只是做了同样的事情,确保所有PK的生成列名称都具有格式tablename_id

默认情况下,在JPA模式下使用hibernate时,它使用EJB3NamingStrategy作为其默认命名策略。通过创建扩展NamingStrategy的以下自定义EJB3NamingStrategy,您可以更改命名策略仅限主键并保持JPA标准指定的其他命名策略保持不变。

public class CustomNamingStrategy extends EJB3NamingStrategy {

    private static final long serialVersionUID = -1953826881322136108L;
    private String currentTableName;

    public String propertyToColumnName(String propertyName) {

        if (propertyName.equalsIgnoreCase("id")) {
            return currentTableName + "_id";
        } else {
            return StringHelper.unqualify(propertyName);
        }
    }

    public String tableName(String tableName) {
        currentTableName = tableName;
        return tableName;
    }
}

请注意,您必须从所有@Column(name="ID")中删除@Entity,以便hibernate将使用自定义NamingStrategy生成列名称。