基于Annotation 的多对一ManyToOne单向和基于XML配置多对一单向

1)基于Annotation:
多方User:
package com.stark.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="t_user")
public class User {
private String id;
private String name;
private Group group;
/**
*
* 只需在多方User中添加一个Group同时添加注解@ManyToOne即可(Many代表User,One代表Group)
*/
@ManyToOne
@JoinColumn(name="groupId")
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
@Id
//@GeneratedValue
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}


}
一方:
package com.stark.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="t_group")
public class Group {
private String id;
private String name;
@Id
//@GeneratedValue
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}


}

利用一下代码

public class TestSchemaExport {
@Test
public void testSchemaExport() {
new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);
}
}
将会生成如下DDL语句:
create table t_group (groupId varchar(255) not null, groupName varchar(255), primary key (groupId))
create table t_user (userId varchar(255) not null, userName varchar(255), groupId varchar(255), primary key (userId))
alter table t_user add index FKCB63CCB65F00FCD6 (groupId), add constraint FKCB63CCB65F00FCD6 foreign key (groupId) references t_group (groupId)


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.stark.hibernate.model.Group;
import com.stark.hibernate.model.User;
import com.stark.hibernate.util.HibernateUtil;
import com.stark.hibernate.util.Hibernate_AnnotationUtil;


public class UserTest {
private static SessionFactory sessionFactory;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
sessionFactory=Hibernate_AnnotationUtil.getSessionFactory();
}
@Test
public void saveUser() {
Session session = sessionFactory.openSession();
session.beginTransaction();
Group g =new Group();
g.setGroupId(01);
g.setGroupName("software");
// 如果不添加session.save(g),则不能成功保存,抛出TransientObjectException异常
//因为Group为Transient状态,groupId没有分配值
//persistent状态的对象是不能引用transient状态的对象的
//采用cascade属性是解决TransientObjectException异常的一种手段
session.save(g);
User u= new User();
u.setUserId(01);
u.setUserName("ZhangSan");
u.setGroup(g);
session.save(u);
session.getTransaction().commit();
session.close();
}
@Test
public void getUser(){
Session session = sessionFactory.openSession();
session.beginTransaction();
User u=(User)session.get(User.class, 1);
System.out.println("UserId:"+u.getUserId());
System.out.println("UserName:"+u.getUserName());
System.out.println("GroupId:"+u.getGroup ().getGroupId());
System.out.println("GroupName:"+u.getGroup().getGroupName());
session.getTransaction().commit();
session.close();
}


@AfterClass
public static void tearDownAfterClass() throws Exception {
sessionFactory.close();
}

}


查询结果如下:
UserId:1
UserName:ZhangSan
GroupId:1
GroupName:software

2)基于XML:
将以上User和Group 中所有@注解去掉
Group.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.stark.hibernate.model">
<class name="Group" table="t_group">
<id name="groupId" >
<generator class="native"/>
</id>
<property name="groupName"/>
</class>
</hibernate-mapping>
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.stark.hibernate.model">
<class name="User" table="t_user">
<id name="userId">
<generator class="native"/>
</id>
<property name="userName" />
<many-to-one name="group" column="groupId" ></many-to-one>
</class>
</hibernate-mapping>


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.stark.hibernate.model.Group;
import com.stark.hibernate.model.User;
import com.stark.hibernate.util.HibernateUtil;
import com.stark.hibernate.util.Hibernate_AnnotationUtil;


public class UserTest {
private static SessionFactory sessionFactory;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
//sessionFactory=Hibernate_AnnotationUtil.getSessionFactory();
sessionFactory=HibernateUtil.getSessionFactory();
}
@Test
public void saveUser() {
Session session = sessionFactory.openSession();
session.beginTransaction();
Group g =new Group();
g.setGroupId(01);
g.setGroupName("software");
// 如果不添加session.save(g),则不能成功保存,抛出TransientObjectException异常
//因为Group为Transient状态,groupId没有分配值
//persistent状态的对象是不能引用transient状态的对象的
session.save(g);
User u= new User();
u.setUserId(01);
u.setUserName("ZhangSan");
u.setGroup(g);
session.save(u);
session.getTransaction().commit();
session.close();
}
@Test
public void getUser(){
Session session = sessionFactory.openSession();
session.beginTransaction();
User u=(User)session.get(User.class, 1);
System.out.println("UserId:"+u.getUserId());
System.out.println("UserName:"+u.getUserName());
System.out.println("GroupId:"+u.getGroup().getGroupId());
System.out.println("GroupName:"+u.getGroup().getGroupName());
session.getTransaction().commit();
session.close();
}


@AfterClass
public static void tearDownAfterClass() throws Exception {
sessionFactory.close();
}

}


如在User.hbm.xml 中
添加:
<many-to-one name="group" column="groupId" cascade="all" ></many-to-one>
则在saveUser时就不用先saveGroup了,[size=xx-small][/size][align=center][/align]因为采用了cascade属性,所以它会先保存Group
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值