0

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

超类

@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.
...
}
4

1 回答 1

2

我只是做完全相同的事情,以确保为所有 PK 生成的列名将具有 format 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此类中删除,以便休眠将使用自定义NamingStrategy生成列名。

于 2012-11-22T11:23:19.273 回答