Skip to content

OneToOne

java
@Target({METHOD,FIELD})
@Retention(RUNTIME)
public @interface OneToOne

指定了与另一个实体的一对一多重性(one-to-one multiplicity)的单值关联。通常不需要显式指定关联的目标实体,因为它通常可以从所引用对象的类型中推断出来。如果关系是双向的,非拥有方必须使用 OneToOne 注解的 mappedBy 元素来指定拥有方的关系字段或属性。

OneToOne 注解可以在可嵌入类(embeddable class)中使用,以指定从该可嵌入类到实体类的关系。如果关系是双向的,并且包含该可嵌入类的实体位于关系的拥有方,那么非拥有方必须使用 OneToOne 注解的 mappedBy 元素来指定可嵌入类中的关系字段或属性。在 mappedBy 元素中必须使用点(".")符号语法来指示嵌套属性中的关系属性。点语法中使用的每个标识符的值是各自嵌套字段或属性的名称。

示例 1:映射外键列的一对一关联

java
// Customer 类中的代码:

@OneToOne(optional=false)
@JoinColumn(
    name="CUSTREC_ID", unique=true, nullable=false, updatable=false)
public CustomerRecord getCustomerRecord() { return customerRecord; }

// CustomerRecord 类中的代码:

@OneToOne(optional=false, mappedBy="customerRecord")
public Customer getCustomer() { return customer; }

示例 2:源和目标共享相同主键值的一对一关联

java
// Employee 类中的代码:

@Entity
public class Employee {
    @Id Integer id;

    @OneToOne @MapsId
    EmployeeInfo info;
    ...
}

// EmployeeInfo 类中的代码:

@Entity
public class EmployeeInfo {
    @Id Integer id;
    ...
}

示例 3:从可嵌入类到另一个实体的一对一关联

java
@Entity
public class Employee {
   @Id int id;
   @Embedded LocationDetails location;
   ...
}

@Embeddable
public class LocationDetails {
   int officeNumber;
   @OneToOne ParkingSpot parkingSpot;
   ...
}

@Entity
public class ParkingSpot {
   @Id int id;
   String garage;
   @OneToOne(mappedBy="location.parkingSpot") Employee assignedTo;
   ...
}

元素详细信息

optional

java
boolean optional

(可选)该关联是否是可选的。如果设置为 false,则必须始终存在非空的关系。

默认值:true