1、每个数据库表映射到一个POJO实体类,在实体类中添加Annotation:
/* * 这三行声明该类是一个知识库映射类 */ @javax.persistence.Entity @javax.persistence.Table(name = "t_user") @org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE, region = "POJO")
- 这三行声明该类是一个知识库映射类表名是t_user。在Smartbi中,建议表名以【模块名缩写+下划线开头,即:t_、t_ap_、tr_】等。
- 在POJO类中,Annotation应该标注在类名定义、getter方法上,而不要直接定义在属性上。常用的Annotation有:
名称 | 说明 | 备注 |
---|---|---|
@Entity | 本类为POJO,与数据库中的表映射 |
|
@Table | 属性name 声明数据库中的表名 | 在BOF框架中,表名、字段名应该为全小写; 表名格式为【t + 项目类型 + _ + 表名】,如 to_cube,tr_report。 |
@IdClass | 指定使用复合主键,主键类使用 | 指定复合主键对应的类,主键类的属性名称与主类的属性名称全部相同,主类中属性均声明@Id。具体请参看UserConfig等实现。 |
@Embeddable | 配合@IdClass指定本类为主键类 |
|
@NamedQueries | 声明多个预编译的HQL语句 |
|
@NamedQuery | 声明预编译HQL语句 | name语句名称 query为HQL语法的查询,可使用参数,允许跨表查询。 |
@Cache | 使用缓存提高访问效率 | 策略应为READ_WRITE,区域为POJO。 |
@Id | 声明属性为主键 |
|
@Column | 属性name声明表中字段名称 | 字段名应为c_开头,字段名必须全小写。 |
@Type | 属性type声明字段类型 | 默认不需要增加此标注,只在以下两种情况需要:
|
@Transient | 声明没有映射知识库字段 |
|
@ManyToOne | 声明多对一关系,需配合@JoinColumn使用 | fetch一般为LAZY。 |
@JoinColumn | 声明多对一中的字段名称 | 指定【多】这一方中的字段名称,对应【一】的主键值。 |
@OneToMany | 声明一对多关系,通常由mappedBy指定由【多】方控制 | 方法声明应该使用泛型:public List<ResourceTreeNode> getChildNodes() mappedBy:指定对应【多】方中属性名称,注意这里是由对象getter来判断而不是类的成员变量。参考HQL语句中的getter/setter说明。 |
@OrderBy | 指定一对多关系中,返回的列表排序方式 |
|
@ManyToMany | 指定多对多关系,需配合@JoinTable | 一般声明fetch为LAZY,cascade为ALL,其中一方增加@JoinTable,另一方由mappedBy指定第一方的属性名称。 |
@JoinTable | 指定多对多关系中使用到的中间表 | name指定中间表名 joinColumns指定本方@JoinColumn inverseJoinColumns对方@JoinColumn。 |
@JoinColumn | 配合@JoinTable多对多关系 | name指定本表中的字段名 referencedColumnName中间表字段名。 |
2、映射中中还可以使用NamedQuery注解声明HQL查询语句:
@NamedQueries({ @NamedQuery(name = "User.getByName", query = "from User u where u.name = ?"), @NamedQuery(name = "User.getByAlias", query = "from User u where u.alias = ?"), @NamedQuery(name = "User.likeName", query = "from User u where (u.name like ? or u.alias like ?) and u.id <> ? and u.id <> ? ") })
3、每个getter方法前声明Column注解,字段名建议使用c_开头。
4、当使用CLOB类型时,应该声明@Type(type = "smartbi.repository.StringClobType"),以便修正Oracle中CLOB操作可能出现的问题。
5、当需要使用多对一、一对多、多对多映射时,需要额外添加@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")和@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "POJO")和@JoinTable这样的注解。
6、当某些getter方法不需要作为映射到知识库字段时,需要添加@Transient注解。
7、在组件的激活方法public void activate()中调用daoModule.addPOJOClass(class)方法注册新增的实体类。
8、建议新增一个继承 smartbi.repository.AbstractDAO<T, PK>的类(其中T为实体类、PK为实体类的主键),例如public class ResourceTreeNodeDAO extends AbstractDAO<ResourceTreeNode, String>,这样可以简化加载、更新、删除、查询实体类的操作。
2、示例说明
在升级类"UpgradeTask_New.java"中创建了两个知识库表,分别与"ExtSample9_1_A.java"和"ExtSample9_1_B.java"中的描述相对应,"ExtSample9_1_A.java" 和 "ExtSample9_1_B.java"是一对多的关系。另外"Sample9_1_Module.java" 中定义了3个测试方法"setTestInfo、getTestInfo、deleteTestInfo",用于往上述两个知识库表中"添加、读取、删除"数据,测试界面如下:
3、示例代码下载
示例代码下载:Sample9_1.zip