我正在使用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.
...
}
答案 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
生成列名称。