hibernate 一对多双向的问题~~~
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate 一对多双向的问题~~~相关的知识,希望对你有一定的参考价值。
有2个表
public class BlogUser implements Serializable
private long userid;
private String name;
private String password;
private String email;
private Set<Message> messages=new HashSet<Message>();
....省略
public class Message implements Serializable
private long messageid;
private BlogUser user;
private String title;
private String content;
private Date createTime;
...省略.
疑问:我新建一条信息的时候,他又会新建一次BlogUser。这是为什么呢
session=ActionContext.getContext().getSession();
message.setCreateTime(new Date());
BlogUser user=(BlogUser)session.get("userlogin");
message.setUser(user);
。。。。。。
我写的表结构如下~~我也不知道哪错了~
<hibernate-mapping package="org.pojo">
<class name="BlogUser" lazy="false">
<id name="userid">
<generator class="increment"/>
</id>
<property name="name" unique="true"/>
<property name="password"/>
<property name="email"/>
<set name="messages"
lazy="false"
inverse="true"
cascade="all">
<key column="user_id"></key>
<one-to-many class="Message"/>
</set>
++++++++++++++++++++++++++++++++++++++++++++++++++
<hibernate-mapping package="org.pojo">
<class name="Message" lazy="false">
<id name="messageid">
<generator class="increment"/>
</id>
<property name="title"/>
<property name="content"/>
<property name="createTime"/>
<many-to-one name="user"
class="BlogUser"
column="user_id" >
</many-to-one>
通过baidu或者hibernate所有主键生成方式 ..又涨知识了 :)
主键产生器
可选项说明:
1) assigned
主键由外部程序负责生成,无需Hibernate参与,即由用户自己指定。
2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、mysql中的主键生成机制。
6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。
7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
10) foreign
使用外部表的字段作为主键。一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适 参考技术A 在hibernate.cfg.xml文件中配置 <property name="hbm2ddl.auto">update</property>
映射一对多-02双向inverse
1.
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping 3 PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping > 6 7 <class name="mypack.Monkey" table="MONKEYS"> 8 9 <id name="id" type="long" column="ID"> 10 <generator class="increment"/> 11 </id> 12 13 <property name="name" type="string" column="NAME" /> 14 15 <many-to-one 16 name="team" 17 column="TEAM_ID" 18 class="mypack.Team" 19 cascade="save-update" 20 /> 21 22 </class> 23 24 </hibernate-mapping>
2.
1 package mypack; 2 3 public class Monkey { 4 5 6 private long id; 7 private String name; 8 private Team team; 9 10 public Monkey() {} 11 12 public Monkey(String name, Team team) { 13 this.name = name; 14 this.team = team; 15 } 16 17 public long getId() { 18 return this.id; 19 } 20 21 public void setId(long id) { 22 this.id = id; 23 } 24 public String getName() { 25 return this.name; 26 } 27 28 public void setName(String name) { 29 this.name = name; 30 } 31 public Team getTeam() { 32 return this.team; 33 } 34 35 public void setTeam(Team team) { 36 this.team = team; 37 } 38 }
3.
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping 3 PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping > 6 7 <class name="mypack.Team" table="TEAMS" > 8 <id name="id" type="long" column="ID"> 9 <generator class="increment"/> 10 </id> 11 12 <property name="name" type="string" column="NAME" /> 13 <!-- 14 <set 15 name="monkeys" 16 cascade="all-delete-orphan" 17 inverse="true" 18 > 19 20 <key column="TEAM_ID" /> 21 <one-to-many class="mypack.Monkey" /> 22 </set> 23 --> 24 <set 25 name="monkeys" 26 inverse="true" 27 cascade="save-update" 28 > 29 30 <key column="TEAM_ID" /> 31 <one-to-many class="mypack.Monkey" /> 32 </set> 33 34 </class> 35 </hibernate-mapping>
4.
1 package mypack; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 public class Team{ 7 8 private long id; 9 private String name; 10 private Set monkeys = new HashSet(); 11 12 public Team() {} 13 14 public Team(String name, Set monkeys) { 15 this.name = name; 16 this.monkeys = monkeys; 17 } 18 19 public long getId() { 20 return this.id; 21 } 22 23 public void setId(long id) { 24 this.id = id; 25 } 26 public String getName() { 27 return this.name; 28 } 29 30 public void setName(String name) { 31 this.name = name; 32 } 33 public Set getMonkeys() { 34 return this.monkeys; 35 } 36 37 public void setMonkeys(Set monkeys) { 38 this.monkeys = monkeys; 39 } 40 }
5.
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE hibernate-configuration 3 PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <property name="dialect"> 8 org.hibernate.dialect.MySQLDialect 9 </property> 10 <property name="connection.driver_class"> 11 com.mysql.jdbc.Driver 12 </property> 13 <property name="connection.url"> 14 jdbc:mysql://localhost:3306/sampledb 15 </property> 16 <property name="connection.username"> 17 root 18 </property> 19 <property name="connection.password"> 20 1234 21 </property> 22 <property name="show_sql">true</property> 23 <mapping resource="mypack/Team.hbm.xml" /> 24 <mapping resource="mypack/Monkey.hbm.xml" /> 25 </session-factory> 26 </hibernate-configuration>
6.
以上是关于hibernate 一对多双向的问题~~~的主要内容,如果未能解决你的问题,请参考以下文章