OneToOne 、OneToMany 、 ManyToMany

[align=center][size=x-large][color=darkred][b]OneToOne OneToMany ManyToMany[/b][/color][/size][/align]

[size="medium"][color=brown][b]
@ManyToOne 默认fetch=FetchType.enger
@OneToMany 默认fetch=FetchType.Lazy

重要:
双向关系:一定分别在两个类里面设“双向关联”即(假如dish和Sort双向关系:sort里面设:OneToMany(mappedBy="sort") dish里面设:@ManyToOne)
双向关联:一定要设 XXToXX(mappedBy="") 便于表之间数据一致
[/b][/color][/size]


[size=large][color=red][b]一、联合主键[/b][/color][/size]

@Entity
class Customer {
@EmbeddedId CustomerId id;
boolean preferredCustomer;
}

@Embeddable
class CustomerId implements Serializable {
@OneToOne
@JoinColumns({
@JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"),
@JoinColumn(name="userlastname_fk", referencedColumnName="lastName")
})
User user;
String customerNumber;

//implements equals and hashCode
}

@Entity
class User {
@EmbeddedId UserId id;
Integer age;
}

@Embeddable
class UserId implements Serializable {
String firstName;
String lastName;


//implements equals and hashCode
}


<class name="Customer">
<composite-id name="id" class="CustomerId">
<key-property name="firstName" column="userfirstname_fk"/>
<key-property name="lastName" column="userfirstname_fk"/>
<key-property name="customerNumber"/>
</composite-id>

<property name="preferredCustomer"/>

<many-to-one name="user">
<column name="userfirstname_fk" updatable="false" insertable="false"/>
<column name="userlastname_fk" updatable="false" insertable="false"/>
</many-to-one>
</class>

<class name="User">
<composite-id name="id" class="UserId">
<key-property name="firstName"/>
<key-property name="lastName"/>
</composite-id>

<property name="age"/>
</class>



[size=large][b][color=red]二、one-To-many单向关联[/color][/b][/size]

public class Parent {
@Id
@GeneratedValue
private long id;

@OneToMany
private Set<Child> children;

// getter/setter
...
}


public class Child {
@Id
@GeneratedValue
private long id;
private String name;


// getter/setter
...
}



<hibernate-mapping>

<class name="Parent">
<id name="id">
<generator class="sequence"/>
</id>
<set name="children">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
</class>

<class name="Child">
<id name="id">
<generator class="sequence"/>
</id>
<property name="name"/>
</class>

</hibernate-mapping>


create table parent ( id bigint not null primary key )
create table child ( id bigint not null primary key, name varchar(255), parent_id bigint )
alter table child add constraint childfk0 (parent_id) references parent





[size=large][b][color=red]三、one-To-many 双向关联[/color][/b][/size]如果父亲是必须的,那么就可以使用双向 one-to-many 的关联了

public class Parent {
@Id
@GeneratedValue
private long id;

@OneToMany(mappedBy="parent")
private Set<Child> children;

// getter/setter
...
}


public class Child {
@Id
@GeneratedValue
private long id;

private String name;

@ManyToOne
@JoinColumn(name="parent_id")//与上面的OneToMany(mappedBy="parent")对应
private Parent parent;


// getter/setter
...
}



<hibernate-mapping>

<class name="Parent">
<id name="id">
<generator class="sequence"/>
</id>
<set name="children" inverse="true">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
</class>

<class name="Child">
<id name="id">
<generator class="sequence"/>
</id>
<property name="name"/>
<many-to-one name="parent" class="Parent" column="parent_id" not-null="true"/>
</class>

</hibernate-mapping>






create table parent ( id bigint not null primary key )
create table child ( id bigint not null
primary key,
name varchar(255),
parent_id bigint not null )
alter table child add constraint childfk0 (parent_id) references parent





[size=large][color=red][b]四、one-To-many单向 外键不为空Not Null[/b][/color][/size]

public class Parent {
@Id
@GeneratedValue
private long id;

@OneToMany(optional=false)
private Set<Child> children;

// getter/setter
...
}


public class Child {
@Id
@GeneratedValue
private long id;
private String name;


// getter/setter
...
}






hibernate-mapping>

<class name="Parent">
<id name="id">
<generator class="sequence"/>
</id>
<set name="children">
<key column="parent_id" not-null="true"/>
<one-to-many class="Child"/>
</set>
</class>

<class name="Child">
<id name="id">
<generator class="sequence"/>
</id>
<property name="name"/>
</class>

</hibernate-mapping>





[size=large][b][color=red]五、many-To-many[/color][/b][/size]

public class Parent {
@Id
@GeneratedValue
private long id;

@ManyToMany
private Set<Child> children;

// getter/setter
...
}


public class Child {
@Id
@GeneratedValue
private long id;

private String name;


// getter/setter
...
}





<hibernate-mapping>

<class name="Parent">
<id name="id">
<generator class="sequence"/>
</id>
<set name="children" table="childset">
<key column="parent_id"/>
<many-to-many class="Child" column="child_id"/>
</set>
</class>

<class name="Child">
<id name="id">
<generator class="sequence"/>
</id>
<property name="name"/>
</class>

</hibernate-mapping>





create table parent ( id bigint not null primary key )
create table child ( id bigint not null primary key, name varchar(255) )
create table childset ( parent_id bigint not null,
child_id bigint not null,
primary key ( parent_id, child_id ) )
alter table childset add constraint childsetfk0 (parent_id) references parent
alter table childset add constraint childsetfk1 (child_id) references child

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值