0 0

让人郁闷的hibernate一对一关联问题15

这个问题困扰我好久了,实在找不到原因,只能来问一下大家了,我一对一关联的是文章表和内容表,据说某个属性可以延迟加载,但是好像比较麻烦,所以我就把文章表(TNews)和文章内容(TNewsContent)表搞成一对一关联,

下面是TNewsContent文件的配置文件和代码:
<?xml version="1.0" encoding="utf-8"?>
<!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.bhsc.entity.TNewsContent" table="T_newsContent" 
		schema="dbo" catalog="hldb" lazy="true">
        <id name="newsId" column="news_id">
        	<generator class="foreign"> 
				<param name="property">tnews</param> 
			</generator> 
        </id>
		<one-to-one name="tnews" 
			class="com.bhsc.entity.TNews" 
			constrained="true"/>
		<property name="newsContent" type="string">
			<column name="news_content" />
		</property>
    </class>
</hibernate-mapping>



package com.bhsc.entity;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

@SuppressWarnings("serial")
public class TNewsContent implements java.io.Serializable {

	// Fields
	private Integer newsId;
	private TNews tnews;
	private String newsContent;

	// Constructors

	/** default constructor */
	public TNewsContent() {
	}

	public TNews getTnews() {
		return tnews;
	}

	public void setTnews(TNews tnews) {
		this.tnews = tnews;
	}

	public String getNewsContent() {
		return this.newsContent;
	}

	public void setNewsContent(String newsContent) {
		this.newsContent = newsContent;
	}

	public boolean equals(Object o) { 
		if (!(o instanceof TNewsContent)){ 
			return false; 
		} 
		TNewsContent tnewsContent = (TNewsContent) o; 
		return new EqualsBuilder().appendSuper(super.equals(o)) 
			.append(this.newsContent, tnewsContent.getNewsContent()) .isEquals(); 
		} 

		public int hashCode() { 
			return new HashCodeBuilder(17, 37). append(newsContent). 
			toHashCode(); 
		}

		public Integer getNewsId() {
			return newsId;
		}

		public void setNewsId(Integer newsId) {
			this.newsId = newsId;
		}


}



下面是TNews文件的配置文件和代码(我把其他无关的属性都去掉了):

package com.bhsc.entity;

/**
 * TNews entity.
 * 
 * @author MyEclipse Persistence Tools
 */

@SuppressWarnings("serial")
public class TNews implements java.io.Serializable {

	// Fields

	private Integer newsId;
	private TNewsContent tnewsContent;

	// Constructors

	/** default constructor */
	public TNews() {
	}


	/** full constructor */
	public TNews(TNewsContent tnewsContent){
		this.tnewsContent=tnewsContent;
	}

	// Property accessors

	public Integer getNewsId() {
		return this.newsId;
	}

	public void setNewsId(Integer newsId) {
		this.newsId = newsId;
	}

	public TNewsContent getTnewsContent() {
		return tnewsContent;
	}

	public void setTnewsContent(TNewsContent tnewsContent) {
		this.tnewsContent = tnewsContent;
	}

}

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.bhsc.entity.TNews" table="T_news" schema="dbo" catalog="hldb">
        <id name="newsId" type="integer">
            <column name="news_id" />
            <generator class="identity" />
        </id>
	<one-to-one name="tnewsContent" class="com.bhsc.entity.TNewsContent" 
		cascade="all" constrained="true" />


    </class>
</hibernate-mapping>



下面是保存文章的代码:
		TNews tnew=new TNews();
		TNewsContent tnewsContent=new TNewsContent();
		tnewsContent.setNewsContent(jo.getString("newsContent"));	
		tnewsContent.setTnews(tnew);//不能省,不然content将不知道从何处取得键值
		tnew.setTnewsContent(tnewsContent);
		newsDAO.makePersitent(tnew);
		return tnew.getNewsId();


按理说,我已经配置了TNewsContent的主键获取策略为foreign,并且在保存的时候也加上了这句代码:
tnewsContent.setTnews(tnew);


那么保存的时候就应该能获得到键值了,可是却出现了下面的错误:


2008-07-10 12:09:36,906 null id generated for:class com.bhsc.entity.TNewsContent; nested exception is org.hibernate.id.IdentifierGenerationException: null id generated for:class com.bhsc.entity.TNewsContent

2008-07-10 12:09:36,953 ERROR (org.springframework.transaction.interceptor.TransactionInterceptor:367) - Application exception overridden by commit exception



null id generated for:class com.bhsc.entity.TNewsContent
居然使这个原因,大概的意思就是TNewsContent没有主键生成把,可是我检查了好久始终不知道错在哪里?大家帮我看看吧



PS:
问题应该出在配置上,我把一对一关联去了,文章是可以保存的,可是检查不出来啊,郁闷
问题补充:
首先谢谢XMLDB,可是我去掉一对一关联,单独的tnew是可以保存的,而且我发现级联删除不行的,只会删除掉tnew,不会删除tnewsContent,这个应该是配置问题吧,我说的对吗?
2008年7月10日 12:36

3个答案 按时间排序 按投票排序

0 0

采纳的答案

把TNews的constrained="true"去掉

一对一关联的延迟加载好像也要靠cglib修改字节码吧

2008年7月10日 16:03
0 0

从你的代码看出你采用的是一对一双向主键关联。
把TNews的配置文件中的 constrained="true" 去掉,再把你持久化方法中的tnewsContent.setTnews(tnew);去掉,应该就可以保存了.

在TNewsContent中设置了constrained="true"表明你的TNewsContent的主键同时作为外键引用TNews的主键(即newsId)

要设置级联删除的话设置cacade属性就为delete就ok了

2008年7月10日 20:08
0 0

你的问题可能在于tnew 对象没有持久化成功。

2008年7月10日 14:19

相关推荐

    hibernate一对一关联关系

    本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作...

    hibernate一对一主键关联映射(单项关联)

    - **唯一性约束**:在数据库层面,为了确保一对一关联,通常需要添加唯一性约束。例如,`IdCard`表的`person_id`列应具有唯一性约束。 以上就是关于Hibernate中一对一主键关联映射(单项关联)的详细解释。通过这种...

    Hibernate一对一唯一外键关联映射(双向关联)

    一、Hibernate一对一关联类型 一对一关联在现实世界中很常见,例如一个人只有一个身份证,一个身份证也只能属于一个人。在数据库设计中,这种关系通常通过主键和外键的方式实现,其中一方的主键作为另一方的外键,...

    hibernate一对一之唯一外键关联(双向关联)

    - 一对一关联意味着两个实体类之间存在一对一的关系,比如一个人只有一个身份证,一个身份证也只对应一个人。这种关系在数据库中通常通过一个主键或外键来实现。 2. **唯一外键关联** - 在一对一关联中,唯一外键...

    hibernate外键实现一对一单向关联关系源码

    **一对一关联关系**在数据库设计中表示两个表之间存在唯一的对应关系,例如,一个人可能只有一个护照,或者一个员工只有一个职位。在Hibernate中,这种关系可以通过外键(Foreign Key)在一方或双方实体中实现。 **...

    hibernate主键实现一对一单向关联关系源码

    首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中的唯一一条记录。在Hibernate中,这种关系可以通过共享主键或外键来实现。由于题目中提到的是“主键...

    hibernate一对一主键关联代码实现

    首先,我们需要理解一对一关联的含义:在数据库中,如果一个表的记录只能与另一个表的唯一一条记录对应,这就构成了主键关联的一对一关系。例如,一个人可能只有一个护照,那么“人”表和“护照”表之间的关系就是一...

    Hibernate一对一,一对多,多对多实例

    一对一关联通常出现在两个实体之间存在唯一对应关系的情况,例如一个人只有一个身份证。在Hibernate中,可以通过在实体类的属性上使用`@OneToOne`注解来定义这种关系。此外,还需要通过`@PrimaryKeyJoinColumn`或`@...

    Hibernate一对一关联映射(注解)

    ### Hibernate一对一关联映射原理 一对一关联映射是指在数据库中两个表之间存在一对一的关系,例如,一个人只有一个身份证,一个身份证也只属于一个人。在Hibernate中,我们可以通过@OneToOne注解来实现这种映射。 ...

    hibernate框架一对一测试案例

    **hibernate框架一对一关联测试案例详解** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了...同时,对于一对一关联,还需要关注性能问题,因为过多的一对一关联可能导致数据库查询效率下降。

    hibernate一对一实例

    在这个“hibernate一对一实例”中,我们将深入探讨如何在Hibernate中实现一对一的映射,并通过具体的代码示例来帮助理解。 一、一对一关联的概念 一对一关联意味着一个实体只与另一个实体的一个实例相关联,反之...

    Hibernate教程05_关系映射之一对一双向外键关联

    在Hibernate中,一对一关联的配置主要通过注解或XML配置文件完成。对于双向关联,我们需要在两个实体类中分别设置相应的属性和关联注解。 在实体类A中,我们将添加一个类型为B的属性,并使用`@OneToOne`注解来指定...

    Hibernate一对一唯一外键关联映射(单向关联)

    Hibernate一对一关联概述 一对一关联分为两种类型:共享主键关联(Primary Key Join)和唯一外键关联(Unique Foreign Key Join)。在本例中,我们讨论的是后者,即通过一个独立的外键字段在两个表之间建立一对一...

    Hibernate学习要点_one2one 一对一主键双线关联

    在深入探讨Hibernate中的一对一(One-to-One)主键双线关联机制之前,我们首先需要理解几个核心概念:Hibernate框架、实体关系映射以及主键关联的基本原理。Hibernate是Java平台下的一款开源对象关系映射(ORM)框架...

    hibernate之一对一关联映射

    本篇将详细探讨 Hibernate 之中的一对一关联映射,这是一种常见的关系数据库设计模式,在实际开发中经常被用到。 一对一关联映射在Hibernate中表示两个实体类之间存在一对一的关系,也就是说,每个实体类的对象只...

    hibernate实现一对一得关联

    在数据库设计中,一对一关联意味着两个实体之间存在唯一对应的关系,例如一个人只有一个身份证,或者一辆车只能属于一个车主。在Hibernate中,这种关系可以通过注解或XML配置文件进行定义。 **1. 注解方式实现一对...

    Hibernate基于连接表的一对多单向关联

    接下来,让我们讨论如何在Hibernate中设置一对多单向关联。在单向关联中,只有一个实体知道另一个实体的存在,即只有“多”的一方知道“一”的一方。这通常体现在Java类的设计上,其中一个类有一个集合属性,存储另...

    hibernate 双向一对一基于主键的关联映射

    在Hibernate中,一对一关联可以通过`@OneToOne`注解来实现。 ### 3. 双向一对一关联 双向一对一关联意味着两个实体类都可以直接访问对方。例如,有`Person`和`Profile`两个类,一个人对应一个个人资料,一个个人...

    Hibernate ORM - 一对一外键关联关系

    1. **一对一外键关联配置**:在Hibernate中,可以通过在映射文件中添加`&lt;one-to-one&gt;`标签或在实体类上使用`@OneToOne`注解来定义一对一关联。关联的外键通常位于被引用的实体(“一对一”关系的“一”端)中。 2. ...

Global site tag (gtag.js) - Google Analytics