`
java_true
  • 浏览: 112582 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

@JoinColumn

SQL 
阅读更多
@OneToOne注释只能确定实体与实体的关系是一对一的关系,不能指定数据库表中的保存的关联字段。所以此时要结合@JoinColumn标记来指定保存实体关系的配置。

@JoinColumn与本书上一章讲述的@Column注释类似,它的定义如下代码所示。

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface JoinColumn {

String name() default "";

String referencedColumnName() default "";

boolean unique() default false;

boolean nullable() default true;

boolean insertable() default true;

boolean updatable() default true;

String columnDefinition() default "";

String table() default "";

}

在使用@JoinColumn注释时,应注意以下几个问题。

l         @JoinColumn与@Column标记一样,是用于注释表中的字段的。它的属性与@Column属性有很多相同之处,这里就不详细讲述。请读者参阅5.2.2小节中有关@Column属性的部分。

l         @JoinColumn与@Column相区别的是:@JoinColumn注释的是保存表与表之间关系的字段,它要标注在实体属性上。而@Column标注的是表中不包含表关系的字段。

l         与@Column标记一样,name属性是用来标识表中所对应的字段的名称。例如customer表中存在字段addr_id,标识的代码如下所示。

@OneToOne

@JoinColumn(name = "addr_id")

public AddressEO getAddress() {

         return address;

}

若此时,不设置name的值,则在默认情况下,name的取值遵循以下规则:

name=关联表的名称+“_”+ 关联表主键的字段名

例如,CustomerEO实体中,如果不指定name的值,默认将对应name=address_id;因为@JoinColumn注释在实体AddressEO属性上,实体AddressEO对应的表名为“address”;表address的主键是“id”,所以此时对应的默认的字段名称为“address_id”。


提示:此规则只适用于与@OneToOne标记同时使用时。若与@ManyToOne或@ManyToMany标记同时使用时,将遵循其他的规则。

l         默认情况下,关联的实体的主键一般是用来做外键的。但如果此时不想主键作为外键,则需要设置referencedColumnName属性。例如,将address表中增加一个字段“ref_id”,address表的建表SQL变为以下所示。

CREATE TABLE address (

id int(20) NOT NULL auto_increment,

ref_id int int(20) NOT NULL,

province varchar(50) ,

city varchar(50) ,

postcode varchar(50) ,

detail varchar(50) ,

PRIMARY KEY (id)

)

此时,通过customer表中的“address_id”字段关联的是address表中的“ref_id”,而“ref_id”并不是address表中的主键,则实体中标注如代码下所示。

@OneToOne

@JoinColumn(name = "address_id",referencedColumnName="ref_id")

public AddressEO getAddress() {

         return address;

}


属性referencedColumnName标注的是所关联表中的字段名,若不指定则使用的所关联表的主键字段名作为外键。

l         JoinColumn标记不仅能够与@OneToOne使用,也可以@ManyToOne或@ManyToMany标记同时使用,它们所表示的含义不同,这些内容将在下文详细讲述。

分享到:
评论

相关推荐

    hibernate 关系注解

    `@JoinColumn`用于指定外键的名称,`unique=true`确保外键的唯一性。例如: ```java @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="userid", unique=true) private User user; ``` 2. **一对一外键...

    hibernate各种常用关联关系的基本配置

    @JoinColumn(name = "user_id") private User user; } ``` 二、一对多(OneToMany)关联 一个实体可以与多个其他实体相关联,如用户和订单。配置时使用`@OneToMany`注解,可设置`mappedBy`、`fetch`(默认为...

    Hibernate注释

    `@JoinColumn(name = "trainer_id")`指定了`Trainer`表的关联字段,`@JoinColumn(name = "monkey_id")`指定了`Monkey`表的关联字段。 #### 四、总结 通过以上内容的介绍,我们了解到在Hibernate中,`@OneToMany`...

    JPA映射关系详解javax JPA JPA映射关系 JPA映射

    在 JPA 中,使用 `@OneToOne` 注解来定义这种关系,并通过 `@JoinColumn` 注解指定关联字段。 **示例代码:** ```java @OneToOne @JoinColumn(name = "USER_ID") private UserEmail userEmail; ``` 在这个例子中...

    Hibernate_Annotation关联映射

    上面的例子是指Trousers通过Trousers的外键列zip_id和TrousersZip关联,@JoinColumn批注定义了联接列,该批注和@Column批注有点类似,但是多了一个名为referencedColumnName的参数。该参数定义了所关联目标实体中的...

    Hibernate 的多对一、一对多、多对多

    使用`@ManyToOne`注解,并配合`@JoinColumn`来指定外键列的名称和引用的主键。 ```java @Entity public class Employee { @ManyToOne @JoinColumn(name = "department_id") private Department department; // ...

    Hibernate关于注解的一对多,多对多,一对一

    2. **@JoinColumn** 或 **@JoinTable**:对于一端,我们通常需要使用`@JoinColumn`注解来指定外键所在的列,如果关系是通过中间表建立的,则使用`@JoinTable`。 ```java @Entity public class Teacher { @...

    Hibernate实体关联速查表

    在实体关联中,外键通常由`@JoinColumn`或`@JoinColumns`注解定义,用于指定数据库中的外键字段和列名。 **八、反向引用(Inverse)** `mappedBy`属性用于指定关联关系的反向字段,这样可以避免在两个实体类中都写...

    hibernate 一对一 多对多的关系

    在上述代码中,`@OneToOne`注解用于声明一对一关系,`mappedBy`属性表示反向关联,而`@JoinColumn`则指定了关联字段的名称。 #### 外键(ForeignKey) ```java @Entity public class User { @Id @GeneratedValue...

    hibernate常用一对一、一对多、多对一、多对多映射关系真实例子(华南银行项目)

    @JoinColumn(name = "account_id") private Account account; } ``` **一对多映射(One-to-Many)** 在银行系统中,一个客户可能有多个账户,这就是典型的一对多关系。我们使用`@OneToMany`注解来表示。可以设置`...

    Hibernate表关系总结(一对一,多对一,多对多)

    - 单向:一个实体类包含另一个实体类的引用,通过`@OneToOne`注解和`@JoinColumn`指定外键字段。 - 双向:两个实体类互相引用,使用`mappedBy`属性指定双向关系的主导方。 ```java @Entity @Table(name = "_...

    Hibernate 注解一对多,多对一

    1. 在使用`@OneToMany`时,如果没有指定`mappedBy`,那么在父类中需要使用`@JoinColumn`指定外键字段,并且这个字段通常会在数据库中创建一个索引。 2. 当使用`FetchType.LAZY`时,需要确保JPA实现支持懒加载,例如...

    hibernate 关联例子

    inverseJoinColumns = @JoinColumn(name = "student_id")) private Set<Student> students; } @Entity public class Student { @ManyToMany(mappedBy = "students") private Set<Course> courses; } ``` Course...

    Hibernate的三种关系映射例子演示

    这里的`mappedBy`属性用于指定外键位于哪个实体,而`@JoinColumn`则用于指定外键所在的表和列名。 2. 一对多关系映射(One-to-Many) 在一对多关系中,一个实体可以对应多个其他实体的实例。例如,一个班级(Class...

    hibernate one-to-many 单/双向关联映射配置心得

    2. 在子类中,添加`@ManyToOne`和`@JoinColumn`注解,但`@JoinColumn`是可选的,因为它默认会根据父类的主键生成外键。 ```java @Entity public class Child { @ManyToOne @JoinColumn(name = "parent_id") ...

    EJB 一对一 一对多 多对多 的代码

    同时,可以使用`@JoinColumn`来指定连接字段,它通常用于主键外键的映射。例如: ```java @Entity public class User { @Id private Long id; @OneToOne(mappedBy = "user") private Profile profile; } @...

    hibernate表关联实例

    @JoinColumn(name = "person_id") private Person person; } ``` 二、一对多关联(One-to-Many) 当一个实体可以关联到多个其他实体时,这就是一对多关联。例如,一个部门有多个员工。在Hibernate中,可以使用`@...

    springside3

    inverseJoinColumns = @JoinColumn(name = "course_id")) private Set<Course> courses; } @Entity public class Course { @ManyToMany(mappedBy = "courses") private Set<Student> students; } ``` 六、...

Global site tag (gtag.js) - Google Analytics