Java Hibernate使用命名策略生成pk ID

Java Hibernate使用命名策略生成pk ID,java,hibernate,Java,Hibernate,我正在使用HibernateJPA。我想扩展一个包含pk生成器和一些hash equals代码的基类,但是我的公司正在使用table_name_id来描述物理数据库中的id,这似乎是不可能的。我刚刚被告知可以使用hibernates命名策略将表名动态地添加到变量的前缀,但是我还没有找到一个很好的例子来说明如何实现这一点。有人能给我指一些关于如何实现这一点的示例代码或文档吗 超类 @MappedSuperclass public abstract class Base implements Ser

我正在使用HibernateJPA。我想扩展一个包含pk生成器和一些hash equals代码的基类,但是我的公司正在使用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.
...
}

我只是做了完全相同的事情,确保为所有PK生成的列名的格式为
tablename\u 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;
    }
}

请注意,您必须从所有
@实体中删除
@列(name=“ID”)
,以便hibernate使用自定义
命名策略来生成列名

我可能看错了您的问题,但您是否希望:在持久化实体时为其id添加前缀?@Andreas请参阅上面的代码示例。希望这能更好地解释我想做什么。他希望他的Id列改为table_name_Id而不是Id,问题是,是否有一种方法可以用表名动态地预先固定id,这样他就不必在每个带有列注释的子类中放置所有id生成代码来重命名列。@G-Man这正是我要找的。@George: