@Column
默认情况下,JPA 持续性提供程序假设每个实体的持久字段存储在其名称与持久字段的名称相匹配的数据库表列中。
使用 @Column
批注:
-
将持久字段与其他名称关联(如果默认列名难于处理、与事先存在的数据模型不兼容或作为数据库中的列名无效)
-
将持久字段与辅助表中的列关联(请参阅 @SecondaryTable )
-
微调数据库中列的特征
表 1-7 列出了此批注的属性 API 。
。有关更多详细信息,请参阅
属性 | 必需 | 说明 |
---|---|---|
| | 默认值 :空 默认情况下,JPA 使用最少量 SQL 创建一个数据库表列。 如果需要使用更多指定选项创建的列,请将 注意 :捕获批注中的 DDL 信息时,某些 JPA 持续性提供程序可以在生成数据库模式时使用此 DDL。例如,请参阅“用于 Java2DB 模式生成的 TopLink JPA 扩展” 。 |
| | 默认值 : 默认情况下,JPA 持续性提供程序假设所有列始终包含在 如果该列不应包含在这些语句中,请将 |
| | 默认值 : 255 默认情况下,JPA 持续性提供程序假设所有列在用于保存 如果该列不适合于您的应用程序或数据库,请将 |
| | 默认值 :JPA 持续性提供程序假设实体的每个持久字段都存储在其名称与持久字段或属性的名称相匹配的数据库表列中。 要指定其他列名,请将 |
| | 默认值 : 默认情况下,JPA 持续性提供程序假设允许所有列包含空值。 如果不允许该列包含空值,请将 |
| | 默认值 : 0. 默认情况下,JPA 持续性提供程序假设所有列在用于保存十进制(精确数字)值时的精度为 0。 如果该精度不适合于您的应用程序或数据库,请将 |
| | 默认值 : 0. 默认情况下,JPA 持续性提供程序假设所有列在用于保存十进制(精确数字)值时的伸缩度为 0。 如果该伸缩度不适合于您的应用程序或数据库,请将 |
| | 默认值 :JPA 持续性提供程序假设实体的所有持久字段都存储到一个其名称为实体名称的数据库表中(请参阅 @Table )。 如果该列与辅助表关联(请参阅 @SecondaryTable ),请将 |
| | 默认值 : 默认情况下,JPA 持续性提供程序假设允许所有列包含重复值。 如果不允许该列包含重复值,请将 |
| | 默认值 : 默认情况下,JPA 持续性提供程序假设列始终包含在 如果该列不应包含在这些语句中,请将 |
示例 1-8 显示了如何使用此批注使 JPA 将
empId
持久保存到辅助表
EMP_HR
中的列
EMP_NUM
。默认情况下,JPA 将
empName
持久保存到主表
Employee
中的列
empName
。
<!---->
@Entity @SecondaryTable(name="EMP_HR") public class Employee implements Serializable { ... @Column(name="EMP_NUM", table="EMP_HR") private Long empId; private String empName; ... }
@ColumnResult
使用 @ColumnResult
批注返回标量值。标量类型由您在 @ColumnResult
中标识的列类型确定。
有关详细信息,另请参阅 @EntityResult 、@FieldResult 和 @SqlResultSetMapping 。
表 1-8 列出了此批注的属性 API 。
。有关更多详细信息,请参阅
属性 | 必需 | 说明 |
---|---|---|
| | 在原生 SQL 查询的 |
示例 1-9 显示了如何使用此批注将
Item
(请参阅
示例 1-10 )标量
name
包含在结果列表(请参阅
示例 1-11 )中。在该示例中,结果列表将为
Object
数组的
List
,如:
{[Order, "Shoes"], [Order, "Socks"], ...}
。
示例 1-9 使用 @ColumnResult 的 Order 实体
@SqlResultSetMapping( name="OrderResults", entities={ @EntityResult( entityClass=Order.class, fields={ @FieldResult(name="id", column="order_id"), @FieldResult(name="quantity", column="order_quantity"), @FieldResult(name="item", column="order_item") } ) }, columns={ @ColumnResult( name="item_name" ) } ) @Entity public class Order { @Id protected int id; protected long quantity; protected Item item; ... }
@Entity public class Item { @Id protected int id; protected String name; ... }
示例 1-11 结合使用 @SqlResultSetMapping 与 @ColumnResult 的原生查询
Query q = entityManager.createNativeQuery( "SELECT o.id AS order_id, " + "o.quantity AS order_quantity, " + "o.item AS order_item, " + "i.name AS item_name, " + "FROM Order o, Item i " + "WHERE (order_quantity > 25) AND (order_item = i.id)", "OrderResults" ); List resultList = q.getResultList(); // List of Object arrays:{[Order, "Shoes"], [Order, "Socks"], ...}
@DiscriminatorColumn
指定一个标识符列名(如果数据模型中的列名不是默认列名 DTYPE
)。
表 1-9 列出了此批注的属性 API 。
。有关更多详细信息,请参阅
属性 | 必需 | 说明 |
---|---|---|
| | 默认值 :空 默认情况下,JPA 持续性提供程序使用最少量 SQL 创建一个数据库表列。 如果需要使用更多指定选项创建的列,请将 |
| | 默认值 : 默认情况下,JPA 持续性提供程序假设标识符类型为 如果要使用其他类型,请将 您的 @DiscriminatorValue 必须符合此类型。 |
| | 默认值 : 31 默认情况下,JPA 持续性提供程序假设标识符列在用于保存 如果该列不适合于您的应用程序或数据库,请将 您的 @DiscriminatorValue 必须符合此长度。 |
| | 默认值 :JPA 持续性提供程序假设标识符列名为“ 要指定其他列名,请将 |
示例 1-12 显示了如何使用此批注指定一个名为
DISC
、类型为
STRING
、长度为 20 的标识符列。在本示例中,该类的
@DiscriminatorValue 指定为
CUST
。
示例 1-13 中的子类将它自己的
@DiscriminatorValue 指定为
VIP
。在
Customer
和
ValuedCustomer
中,
@DiscriminatorValue 的值必须可以转换为由
@DiscriminatorColumn 属性
discriminatorType
指定的类型,并且必须符合
@DiscriminatorColumn 属性
length
。
示例 1-12 @DiscriminatorColumn 和 @DiscriminatorValue — 根类
@Entity @Table(name="CUST") @Inheritance(strategy=SINGLE_TABLE) @DiscriminatorColumn(name="DISC", discriminatorType=STRING, length=20) @DiscriminatorValue(value-"CUST") public class Customer { ... }
示例 1-13 @DiscriminatorValue — 子类
@Entity @DiscriminatorValue(value="VIP") public class ValuedCustomer extends Customer { ... }
@DiscriminatorValue
使用 @DiscriminatorValue
批注指定用于区分此继承层次中的实体的标识符值:
表 1-10 列出了此批注的属性 API 。
。有关更多详细信息,请参阅
属性 | 必需 | 说明 |
---|---|---|
| | 将 |
示例 1-14 显示了如何使用此批注指定一个名为
DISC
、类型为
STRING
、长度为 20 的标识符列。在本示例中,该类的
@DiscriminatorValue 指定为
CUST
。
示例 1-15 中的子类将它自己的
@DiscriminatorValue 指定为
VIP
。在
Customer
和
ValuedCustomer
中,
@DiscriminatorValue 的值必须可以转换为由
@DiscriminatorColumn 属性
discriminatorType
指定的类型,并且必须符合
@DiscriminatorColumn 属性
length
。
示例 1-14 @DiscriminatorColumn 和 @DiscriminatorValue — 根类
@Entity @Table(name="CUST") @Inheritance(strategy=SINGLE_TABLE) @DiscriminatorColumn(name="DISC", discriminatorType=STRING, length=20) @DiscriminatorValue(value-"CUST") public class Customer { ... }
示例 1-15 @DiscriminatorValue — 子类
@Entity @DiscriminatorValue(value="VIP") public class ValuedCustomer extends Customer { ... }
@Embeddable
默认情况下,JPA 持续性提供程序假设每个实体均持久保存到它自己的数据库表。
使用 @Embeddable
批注指定一个类,该类的实例存储为拥有实体的固有部分并共享该实体的身份。嵌入对象的每个持久属性或字段都将映射到实体的数据库表。
示例 1-16 显示了如何使用此批注指定:类 EmploymentPeriod
在用作批注为 @Embedded 的持久字段的类型时可以嵌套到实体中(请参阅示例 1-17 )
@Embeddable public class EmploymentPeriod { java.util.Date startDate; java.util.Date endDate; ... }
@Embedded
默认情况下,JPA 持续性提供程序假设每个实体均持久保存到它自己的数据库表。
可以结合使用 @Embedded
和 @Embeddable 以建立严格所有权关系的模型,以便在删除了拥有对象的情况下还将删除被拥有的对象。
嵌入的对象不应映射到多个表。
默认情况下,@Embeddable 类中指定的列定义(请参阅 @Column )适用于 @Embedded
类。如果要覆盖这些列定义,请使用@AttributeOverride 。
此批注没有属性。有关更多详细信息,请参阅 API 。
示例 1-17 显示了如何使用该批注指定:@Embeddable 类 EmploymentPeriod
(请参阅示