User类:
package com.bryantd.hibernate.entity;import java.io.Serializable;
import java.util.*;import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;public class User implements Serializable {
private Integer id;
private String name;
private int age;private Set addresses;public User(String name, int age) {
super();
// TODO Auto-generated constructor stub
this.name = name;
this.age = age;
}public User(){}public Set getAddresses() {
if (addresses == null) {
return new HashSet();
}
return addresses;
}
public void setAddresses(Set addresses) {
this.addresses = addresses;
}public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}User的映射文件 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><class
name="com.bryantd.hibernate.entity.User"
table="undirectional_one_to_many_user"> <id name="id" type="java.lang.Integer">
<column name="id" sql-type="INTEGER" not-null="true"/>
<generator class="native"/>
</id> <property name="name" type="java.lang.String">
<column name="name" sql-type="VARCHAR"/>
</property><property name="age" type="int">
<column name="age" sql-type="INTEGER"/>
</property><!-- We usually set the class with the associated column as the domain class. -->
<set name="addresses" table="undirectional_one_to_many_address" cascade="all" inverse="true">
<key column="user_id"/>
<one-to-many class="com.bryantd.hibernate.entity.Address"/>
</set>
</class></hibernate-mapping>Address类:
package com.bryantd.hibernate.entity;import java.io.Serializable;
import java.util.*;import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;public class Address implements Serializable {
private Integer id;
private String address;
private String telephone;private User user;public Address(String address, String telephone) {
super();
// TODO Auto-generated constructor stub
this.address = address;
this.telephone = telephone;
}public Address() {}public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}public boolean equals(Object object) {
if (!(object instanceof Address)) {
return false;
}
Address anotherAddress = (Address)object;
return new EqualsBuilder().appendSuper(super.equals(object))
.append(this.getAddress(), anotherAddress.getAddress())
.append(this.getTelephone(), anotherAddress.getTelephone())
.isEquals();
}public int hashCode() {
return new HashCodeBuilder().appendSuper(super.hashCode())
.append(this.getAddress())
.append(this.getTelephone())
.hashCode();
}/*
public boolean equals(Object object) {
// TODO Auto-generated method stub
if (onject == this) {
return true;
}
if (object instanceof Address) {
Address address = (Address)object;
if (getAddress() == address.getAddress()) return true;
}
return false;
}public int hashCode() {
// TODO Auto-generated method stub
return getTelephone().hashCode() * getAddress().hashCode();
}
*/
}Address的映射文件:
<?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><class
name="com.bryantd.hibernate.entity.Address"
table="undirectional_one_to_many_address"> <id name="id" type="java.lang.Integer">
<column name="id" sql-type="INTEGER" not-null="true"/>
<generator class="native"/>
</id> <property name="address" type="java.lang.String">
<column name="address" sql-type="VARCHAR)"/>
</property><property name="telephone" type="java.lang.String">
<column name="telephone" sql-type="VARCHAR"/>
</property><many-to-one name="user" class="com.bryantd.hibernate.entity.User" cascade="none"
column="user_id"
not-null="true"/>
</class></hibernate-mapping>
package com.bryantd.hibernate.entity;import java.io.Serializable;
import java.util.*;import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;public class User implements Serializable {
private Integer id;
private String name;
private int age;private Set addresses;public User(String name, int age) {
super();
// TODO Auto-generated constructor stub
this.name = name;
this.age = age;
}public User(){}public Set getAddresses() {
if (addresses == null) {
return new HashSet();
}
return addresses;
}
public void setAddresses(Set addresses) {
this.addresses = addresses;
}public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}User的映射文件 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><class
name="com.bryantd.hibernate.entity.User"
table="undirectional_one_to_many_user"> <id name="id" type="java.lang.Integer">
<column name="id" sql-type="INTEGER" not-null="true"/>
<generator class="native"/>
</id> <property name="name" type="java.lang.String">
<column name="name" sql-type="VARCHAR"/>
</property><property name="age" type="int">
<column name="age" sql-type="INTEGER"/>
</property><!-- We usually set the class with the associated column as the domain class. -->
<set name="addresses" table="undirectional_one_to_many_address" cascade="all" inverse="true">
<key column="user_id"/>
<one-to-many class="com.bryantd.hibernate.entity.Address"/>
</set>
</class></hibernate-mapping>Address类:
package com.bryantd.hibernate.entity;import java.io.Serializable;
import java.util.*;import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;public class Address implements Serializable {
private Integer id;
private String address;
private String telephone;private User user;public Address(String address, String telephone) {
super();
// TODO Auto-generated constructor stub
this.address = address;
this.telephone = telephone;
}public Address() {}public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}public boolean equals(Object object) {
if (!(object instanceof Address)) {
return false;
}
Address anotherAddress = (Address)object;
return new EqualsBuilder().appendSuper(super.equals(object))
.append(this.getAddress(), anotherAddress.getAddress())
.append(this.getTelephone(), anotherAddress.getTelephone())
.isEquals();
}public int hashCode() {
return new HashCodeBuilder().appendSuper(super.hashCode())
.append(this.getAddress())
.append(this.getTelephone())
.hashCode();
}/*
public boolean equals(Object object) {
// TODO Auto-generated method stub
if (onject == this) {
return true;
}
if (object instanceof Address) {
Address address = (Address)object;
if (getAddress() == address.getAddress()) return true;
}
return false;
}public int hashCode() {
// TODO Auto-generated method stub
return getTelephone().hashCode() * getAddress().hashCode();
}
*/
}Address的映射文件:
<?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><class
name="com.bryantd.hibernate.entity.Address"
table="undirectional_one_to_many_address"> <id name="id" type="java.lang.Integer">
<column name="id" sql-type="INTEGER" not-null="true"/>
<generator class="native"/>
</id> <property name="address" type="java.lang.String">
<column name="address" sql-type="VARCHAR)"/>
</property><property name="telephone" type="java.lang.String">
<column name="telephone" sql-type="VARCHAR"/>
</property><many-to-one name="user" class="com.bryantd.hibernate.entity.User" cascade="none"
column="user_id"
not-null="true"/>
</class></hibernate-mapping>
解决方案 »
- 高分急求java字符串分解方法
- 请问:多进程共用一个Log4j是否会产生互锁,应如何解决?
- spring applicationContext.xml简单问题,大家帮忙看看
- eclipse怎么把Spring2.5导入啊???
- 求WEBSERVICE的实例
- 紧急求助!!!!!!关于C3P0连接池的问题!!!!!!!!!!
- 请问Mybatis3.2自定义Ehcache缓存怎么指定配置文件?
- 谁知道怎样设置虚拟主机的编码(URIEncoding)?100分相送.
- ant时出现class file has wrong version 48.0, should be 47.0的错误。
- jbuilder7下开发web service的一个很烦的问题
- 第一个jsp --helloworld出错了????????
- 使用ResultSet的ResultSetMetaData获取表的元信息时一个怪异的问题
package com.bryantd.hibernate.test;import com.bryantd.hibernate.entity.User;
import com.bryantd.hibernate.entity.Address;import org.hibernate.cfg.Configuration;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Query;
import org.hibernate.Transaction;import java.util.*;public class UndirectionalOneToManyTest {
public static void saveObject(Session session, Object savedObject) {
Transaction transaction = session.beginTransaction(); session.save(savedObject);transaction.commit();
}public static void updateObject(Session session, Object updatedObject) {
Transaction transaction = session.beginTransaction();session.saveOrUpdate(updatedObject);transaction.commit();
}public static void deleteObjects(Session session, String deletedObjectName) {
Transaction transaction = session.beginTransaction();String hql = "delete " + deletedObjectName;
Query query = session.createQuery(hql);
query.executeUpdate();transaction.commit();
}public static void showUsers(Session session) {
Transaction transaction = session.beginTransaction();System.out.println("Show Users:");
String hql = "from User";
Query query = session.createQuery(hql);
List list = query.list();
Iterator userIterator = list.listIterator();
while (userIterator.hasNext()) {
User user = (User)userIterator.next();
System.out.println(user.getName());Set addresses = user.getAddresses();
Iterator addressIterator = addresses.iterator();
while (addressIterator.hasNext()) {
Address address = (Address)addressIterator.next();
System.out.println(address.getAddress());
}
}
System.out.println();transaction.commit();
}public static void showAddresses(Session session) {
Transaction transaction = session.beginTransaction();System.out.println("Show Addresses:");
String hql = "from Address";
Query query = session.createQuery(hql);
List list = query.list();
Iterator addressIterator = list.iterator();
while (addressIterator.hasNext()) {
Address address = (Address)addressIterator.next();
System.out.println(address.getAddress());User user = address.getUser();
if (user != null) {
System.out.println(user.getName());
}
}
System.out.println();transaction.commit();
}public static void main(String[] args) {
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();User user = new User("Bryantd", 23);
Address address1 = new Address("address1", "111111");
Address address2 = new Address("address2", "222222");address1.setUser(user);
address2.setUser(user);deleteObjects(session, "User");
deleteObjects(session, "Address");saveObject(session, user);
saveObject(session, address1);
saveObject(session, address2);user.getAddresses().add(address1);
user.getAddresses().add(address2);updateObject(session, user);showUsers(session);
showAddresses(session);
}
}
不要用自己想的方式去认为它应该怎么怎么!!!
你好好看看配置文件,你都没有理解那些属性,象什么cascade,inverse ,而且每个属性的可选值代表的含义也是不一样的。
它是完全可配置的,按照你的要求进行相关的处理,你可以在配置里解决,也可以在程序里面解决,都是可行的。你上面的做法就是配置是非关联的,在程序中进行关联。
下载地址为<a href="http://www.cd-accp.net/web/hbdao.rar">http://www.cd-accp.net/web/hbdao.rar</a>此套件主要用于帮助开发人员在Hibernate环境下开发数据访问层
为了使用此套件,你必须具备JDK1.5(或更高),并且设置你的编译器以支持5.0代码语法
此套件提供以下功能 1.多Hibernate配置文件的支持
2.可嵌套虚拟事务模型的支持
3.事务边界拓展功能的支持
4.事务隔离级别拓展功能的支持
5.数据访问类事务处理自动注入的支持愿我的工作能减轻你的负担, 有问题可以反馈至[email protected], 祝使用愉快!
(接下来的时间里,我将仔细研究.NET的System.Reflect.Emit名字空间以推出NHibernate版本)CSP提示
自本年2月开始,本人开始利用非常宝贵的下班后的休息时间, 开发一套Java Web框架(CSP);目前取得阶段性成果, 不久的将来便可和大家碰面这套Java Web架构提供如下功能 1.服务端的非常像ASP.NET,提供基于视图控件的属性/事件编程模型
2.服务端效防ASP.NET的__VIEWSTATE技术,实现页面的有状态化
3.服务端效防ASP.NET1.1中的模板和数据绑顶功能,以及ASP.NET2.0中的母板功能
4.服务端前台代码使用严格遵循Schema验证的XML书写,Schema验证结构可扩展.支持解析结果的缓冲和热加载功能
5.客户端完全使用Ajax技术实现,所有的UI元素由Javascript动态生成
6.客户端支持__VIEWSTATE隐藏字段信息的拆分和合并,在局部提交的情况下仍然配合全程的服务端工作
7.客户端支持JavaScript文件的按需延迟下载,以达到下载的最小化如果不出意外.不久后此框架会发行面世,届时望四方朋友捧场如果有问题可以反馈到我的信箱[email protected], 谢谢你对本文挡的阅读
陈涛,2006-10-17日于北大青鸟(成都名流)
关于one-to-many的讨论很多,自己看看reference或者google下也好
user.getAddresses().add(address1);
user.getAddresses().add(address2);
在你的测试代码里面没有另外,session.delete()只是简单的转译hql到sql,不处理级联关系。