Hibernate(十二)注解开发

本文介绍了Java持久化API(JPA)中实体类与数据库表的映射规则,包括注解如@Entity、@Table、@Id等的使用,并通过会议室、黑板及会议参与者实例演示了一对一、一对多及多对一的关联映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于类:

每个实体类对应数据库一个表
1、@Entity 映射实体类
2、@Table 映射数句库表
属性:
name - 可选,表示表的名称,默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
catalog - 可选,表示Catalog名称,默认为 Catalog(“”).
schema - 可选 , 表示 Schema 名称 , 默认为Schema(“”).

关于属性

@Id 映射生成主键
@Column(name=”id”) 指定列名
@Version 定义乐观锁
@Column 映射表的列
@Transient 定义暂态属性

@Id - 必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主 键,置于 getXxxx() 前。
属性:
@GeneratedValue(strategy=GenerationType.AUTO) - 可选,用于定义主键生成并自增策略。
@Column - 可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中 该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具非常有作用。
属性:
name - 可选,表示数据库表中该字段的名称,默认情形属性名称一致
nullable -可选,表示该字段是否允许为 null,默认为true
unique - 可选,表示该字段是否是唯一标识,默认为 false
length - 可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255.
insertable -可选,表示在ORM框架执行插入操作时,该字段是否应出现INSETRT 语句中,默认为 true

关联映射

双向多对一:多方有一方的引用,一方有多方的引用。

//级联,optional=true(默认true,作用是设置join连表查询方式,设置为false表示inner join)
    @ManyToOne(cascade=CascadeType.ALL,optional=true)
    @JoinColumn(name="boardroom_id")

双向一对一:两边都有多方的引用,方便查询。

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="**_id",unique=true)

双向一对多:两边都有多方的引用,方便查询。

//fetch=FetchType.EAGER,设置延时加载类型
@OneToMany(mappedBy="自己在另外一方的名字",cascade=CascadeType.ALL,fetch=FetchType.EAGER)

举例:会议室和黑板会会议者之间的关系

/**
 * 黑板实体类
 */
@Entity
@Table(name="T_blackBoard")
public class BlackBoardEntity {
    private int id;
    private int size;
    private BoardroomEntity boardroom;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Column(name="size")
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="boardroom_id",unique=true)
    public BoardroomEntity getBoardroom() {
        return boardroom;
    }
    public void setBoardroom(BoardroomEntity boardroom) {
        this.boardroom = boardroom;
    }
    @Override
    public String toString() {
        return "BlackBoardEntity [id=" + id + ", size=" + size + "]";
    }
}
/**
 * 会议室实体类
 */
@Entity
@Table(name="t_boardroom")
public class BoardroomEntity {
    private int id;
    private String name;
    private String address;
    private BlackBoardEntity blackBoard;    //关联黑板
    private Set<ConventioneerEntity> conventioneer; //关联与会者
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Column(name="address")
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
//   mappedBy自己在另外一方的名字, cascade 级联
    @OneToOne(mappedBy="boardroom",cascade=CascadeType.ALL)
    public BlackBoardEntity getBlackBoard() {
        return blackBoard;
    }
    public void setBlackBoard(BlackBoardEntity blackBoard) {
        this.blackBoard = blackBoard;
    }
//  mappedBy自己在另外一方的名字,级联,fetch=FetchType.EAGER,设置延时加载类型
    @OneToMany(mappedBy="boardroom",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    public Set<ConventioneerEntity> getConventioneer() {
        return conventioneer;
    }
    public void setConventioneer(Set<ConventioneerEntity> conventioneer) {
        this.conventioneer = conventioneer;
    }
    @Override
    public String toString() {
        return "BoardroomEntity [id=" + id + ", name=" + name + ", address=" + address + ", blackBoard=" + blackBoard
                + ", conventioneer=" + conventioneer + "]";
    }
}
/**
     * 会议者实体类
     */
@Entity
@Table(name="t_conventioneer")
public class ConventioneerEntity {
    private int id;
    private String name;
    private BoardroomEntity boardroom;//关联会议室
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    //级联,optional=true(默认true,作用是设置join连表查询方式,设置为false表示inner join)
    @ManyToOne(cascade=CascadeType.ALL,optional=true)
    @JoinColumn(name="boardroom_id")
    public BoardroomEntity getBoardroom() {
        return boardroom;
    }
    public void setBoardroom(BoardroomEntity boardroom) {
        this.boardroom = boardroom;
    }
    @Override
    public String toString() {
        return "ConventioneerEntity [id=" + id + ", name=" + name + "]";
    }
}

最后记得在配置文件中添加映射:

<!-- 配置注解映射文件 -->
        <mapping class="com.zh.annotation.BoardroomEntity"></mapping>
        <mapping class="com.zh.annotation.BlackBoardEntity"></mapping>
        <mapping class="com.zh.annotation.ConventioneerEntity"></mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值