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>

问题应该出在主键的生成方式上 。传统的都用native 或者 assigned
通过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 一对多双向的问题~~~的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate JPA双向一对多结果与约束冲突异常

为啥 Hibernate 在一对多双向更新操作中给出同一实体的多个表示?

hibernate配置双向一对多的时候,困惑了

映射一对多-02双向inverse

HIbernate 一对多双向注解

hibernate 一对多双向关联 外键值为空 怎么结决?