Entity Bean之间也可以进行继承。子类所创建的表自动拥有父类定义的一些字段。如果不想要该父类生成表,那就把它定义为abstract class。@Inheritance的strategy设为TABLE_PER_CLASS,这样每个子类就会有一个对应的表。也可以用SINGLE_TABLE来将所有子类的属性加到父类同一张表去,但是要用DiscriminatorType来区分。这里就不详细展开了。
...... @Entity @Id } |
对于不同entity之间的关系,有
@OneToOne, @OneToMany, @ManyToOne, @ManyToMany 四种ejb3官方定义的映射关系。
两种映射方式:@JoinColumn @JoinTable
下面详细介绍:
1. @OneToOne单向一对多关联
类Company.java
....... @Entity @Id ....... } |
类StockOrder.java
....... @Entity @OneToOne ..... } |
这里用@Table(name="xxx")来给该类创建的表定义一个名字,如果不加该annotation的话,默认创建出来的表名字就是类名。
创建出来的表:
STOCK_ORDER
ORDER_ID | ORDER_NAME | COMPANY_COMPANYID |
2. @OneToMany
创建类Product.java
@Entity @Id |
一张SaleOrder应该包含一个或多个Product,即一对多关系。
SaleOrder.java
@Entity ..... } |
a. 这种默认用法会创建单独一张表来存放SaleOrder和Product的关系,且名字默认为 SALE_ORDER_PRODUCT
SALE_ORDER_ORDER_ID | products_productId |
b. 如果我们在@OneToMany下面加上@JoinColumn的annotation的话,那么这张 SALE_ORDER_PRODUCT的表就不会创建!
而是在Many的那一端——Product的表中加上一个Column来存放SaleOrder的Id。这个地方跟@OneToOne就不同了,@OneToOne是在加入@JoinColumn的类所生成的表里加入column,而@OneToMany默认是在Many的那一端。因为既然是要对应成一个column,多值显然不行。
c. 对于a中的默认行为,我们也可以用显式的方式来定义,即加上@JoinTable。这里举例为
@JoinTable(name="SALE_ORDER_PRODUCT", joinColumns={@JoinColumn(name="ORDER_ID")},inverseJoinColumns=@JoinColumn(name="PRODUCT_ID"))
那么生成的表明就为SALE_ORDER_PRODUCT,表结构就是
ORDER_ID | PRODUCT_ID |