XML映射与应用部署全解析
立即解锁
发布时间: 2025-08-19 02:03:56 阅读量: 2 订阅数: 10 

### XML映射与应用部署全解析
#### 1. 继承映射
实体继承层次结构使用`inheritance`、`discriminator-column`和`discriminator-value`元素进行映射。若更改继承策略,必须为整个实体层次结构进行覆盖。
- **inheritance元素**:用于指示继承层次结构的根,对应`@Inheritance`注解,表明要使用的继承映射策略。当它包含在`entity`元素中时,将覆盖实体类上`@Inheritance`注解中定义或默认的继承策略。
- 例如,将策略从单表更改为连接表可能需要为其下方的每个实体添加一个表。以下是一个将实体层次结构从单表策略更改为连接表策略的示例:
```java
@Entity
@Table(name="EMP")
@Inheritance
@DiscriminatorColumn(name="TYPE")
public abstract class Employee { ... }
@Entity
@DiscriminatorValue("FT")
public class FullTimeEmployee { ... }
@Entity
@DiscriminatorValue("PT")
public class PartTimeEmployee { ... }
```
```xml
<entity-mappings>
<entity class="examples.model.Employee">
<table name="EMP"/>
<inheritance strategy="JOINED"/>
...
</entity>
<entity class="examples.model.FullTimeEmployee">
<table name="FT_EMP"/>
...
</entity>
<entity class="examples.model.PartTimeEmployee">
<table name="PT_EMP"/>
...
</entity>
</entity-mappings>
```
- **discriminator-column元素**:存储用于区分继承层次结构中具体实体子类的值,是`entity`或`entity-result`元素的子元素,用于定义或覆盖鉴别器列。它对应并覆盖`@DiscriminatorColumn`注解,具有`name`、`discriminator-type`、`columnDefinition`和`length`等属性。
- 示例如下:
```java
@Entity
@Inheritance
@DiscriminatorColumn(name="TYPE")
public abstract class Employee { ... }
```
```xml
<entity class="examples.model.Employee">
<inheritance/>
<discriminator-column name="TYPE"/>
...
</entity>
```
- **discriminator-value元素**:用于声明标识存储在数据库行中的具体实体子类的值,仅作为`entity`元素的子元素存在。鉴别器值由元素的内容指示,无属性或子元素。
- 示例如下:
```java
@Entity
@DiscriminatorValue("FT")
public class FullTimeEmployee extends Employee { ... }
```
```xml
<entity class="examples.model.FullTimeEmployee">
<discriminator-value>FT</discriminator-value>
...
</entity>
```
#### 2. 属性和关联覆盖
简单映射和关联可以通过使用属性覆盖和关联覆盖来重写,但仅适用于映射超类的子类实体。从实体超类继承的简单持久状态或关联状态不能以可移植的方式重写。
- 以下是一个重写两个简单的`name`和`salary`持久字段映射,以及一个具有复合主键的`manager`关联的示例:
```java
@MappedSuperclass
@IdClass(EmployeePK.class)
public abstract class Employee {
@Id private String name;
@Id private java.sql.Date dob;
private long salary;
@ManyToOne
private Employee manager;
// ...
}
@Entity
@Table(name="PT_EMP")
@AttributeOverrides({
@AttributeOverride(name="name", column=@Column(name="EMP_NAME")),
@AttributeOverride(name="salary", column=@Column(name="SAL"))})
@AssociationOverride(name="manager",
joinColumns={
@JoinColumn(name="MGR_NAME", referencedName="EMP_NAME"),
@JoinColumn(name="MGR_DOB", referencedName="DOB")})
public class PartTimeEmployee extends Employee { ... }
```
```xml
<entity class="examples.model.PartTimeEmployee">
...
<attribute-override name="name">
<column name="EMP_NAME"/>
</attribute-override>
<attribute-override name="salary">
<column name="SAL"/>
</attribute-override>
<association-override name="manager">
<join-column name="MGR_NAME" referenced-column-name="EMP_NAME"/>
<join-column name="MGR_DOB" referenced-column-name="DOB"/>
</association-override>
...
</entity>
```
###
0
0
复制全文
相关推荐










