Hibernate关系注解映射

本文详细介绍了Hibernate中的一对多、多对一、多对多、一对一、枚举映射、单表继承等核心内容及应用示例。

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

Hibernate关系注解映射

2013年01月31日

一、一对多

  (最好不要用单向关联,其实单向本身并无多大意义):

  一方:

1
2
@OneToMany(targetEntity=Order.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER)
 @JoinColumn(name="fk_customer_id")

  如果一方加了fetch=FetchType.EAGER,查单一的多方对象时,会多产生一条sql

  targetEntity也可以写成mappedBy=“customer”(这里写的是多多中对一方的引用属性),表示由对方去维护外键关系。

  注:一般会将fetch=FetchType.LAZY

  多方:

1
2
@ManyToOne
 @JoinColumn(name="fk_customer_id")

  注:一般需要会将fetch=FetchType.LAZY,默认情况下多方会主动加载一方数据的。

  配置实例(客户—>客户订单):

  客户中的集合:

1
2
3
@OneToMany(targetEntity=Order.class,cascade=CascadeType.ALL)
@JoinColumn(name="fk_customer_id")
private Set<Order> orders = new HashSet<Order>();

  客户订单中的客户:

1
2
3
4
//订单所属客户
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="fk_customer_id")
private Customer customer;

二、多对一

  比较简单,示例:注册用户——>城市

1
2
3
@ManyToOne(targetEntity=City.class, fetch=FetchType.LAZY)
@JoinColumn(name="fk_city_id")
private City city;

三、多对多

  示例:游戏用户,用户组

1
2
3
4
5
6
7
    //用户参加的组
    @ManyToMany(fetch=FetchType.LAZY)
    @Cascade(value={org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    @JoinTable(name="t_user_group",joinColumns={@JoinColumn(name="fk_user_id")}
                ,inverseJoinColumns={@JoinColumn(name="fk_group_id")}
            )
    private Set<Group> groups = new HashSet<Group>();

  而在用户组中:

1
2
3
4
5
6
//该小组 中所包含的用户
    @ManyToMany(mappedBy="groups")
    @Cascade(value={org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    @JoinTable(name="t_user_group",joinColumns={@JoinColumn(name="fk_group_id")}
                ,inverseJoinColumns={@JoinColumn(name="fk_user_id")}
)

四、一对一惟一外键关联

  示例:husband——>wife

  而husband中(外键在t_husband表中):

1
2
3
@OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="fk_wife_id",unique=true)
    private Wife wife;

  wife对象中:

1
2
@OneToOne(mappedBy="wife",cascade=CascadeType.ALL)
 private Husband husband;

五、枚举映射示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
@Table(name="t_husband")
public class Husband {

    //状态
    public enum State {
        haveMoney, noMoney
    }

    //状态
    @Enumerated
    @Column(name="f_state")
    private State state = State.noMoney;

六、单表继承:

  父:

1
2
3
4
5
6
7
8
9
10
11
12
@Entity
@Table(name="t_animal")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="f_type",discriminatorType=DiscriminatorType.STRING)
public class Animal {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="pk_id")
    private int id;

    @Column(name="f_nickname")
    private String nickName;

  子:

1
2
3
4
5
6
@Entity
@DiscriminatorValue(value="d")
public class Dog extends Animal {

    @Column(name="f_color")
    private String color;

  注解方式与spring的整合:

1
2
3
4
5
6
7
8
9
10
<!--  配置sessionFactory-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name=..............</property>
        <property name="packagesToScan">
            <list>
                <value>com.lovo.edu.model</value>
                <value>com.lovo.edu.test</value>
            </list>
        </property>
    </bean>

  关于序列类型主键的配置示例:

1
2
3
4
5
6
7
@Id

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="student_id")

@SequenceGenerator(name="student_id", allocationSize=1, initialValue=1,sequenceName="seq_student_id")

private Long sid;

  其它的一些主键生成方式:

1
2
3
4
@Id
@GenericGenerator(name="idGenerator", strategy="uuid")
@GeneratedValue(generator="idGenerator") //使用uuid的生成策略
//同理:使用assigned策略则在strategy中指定 ="assigned"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值