`
Fly_m
  • 浏览: 259642 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate关联中对于mappedby 继承属性的描述和解决方法

阅读更多

    近期使用Hibernate进行开发,在开发的过程中碰到了几个问题,其中一些是由于不了解Hibernate,另外一些则属于设计或者Hibernate自身不支持一些操作。主要还是对Hibernate自身的一些东西都没有很好地了解,导致出了问题都往google上找,也不太知道其中的道理。现在把这些问题都列下来,以便以后容易查找。

    1,Hibernate ANN-588 在关联引用中不能引用继承的属性。

    这个问题举例如下:

   

父类(图像)
public class Xa implements Serializable{
                //其他属性
	private Yx yx;//引用yx
                @ManyToOne
                public Yx getYx() {


                          return yx;
                }
}

子类A(照片)
public class XsubA extends Xa{
}

子类B(附件资料)
public class XsubB extends Xa{
}

Yx类(人员信息),分别引用子类A和子类B
public class Yx{
                //其他属性
	private List<XsubA> xsubAList;
	private List<XsubB> xsubBList;

	@OneToMany(mappedBy = "yx")
	public List<XsubA> getXsubAList() {
		return xsubAList;
	}
                @OneToMany(mappedBy = "yx")
	public List<XsubB> getXsubBList() {
		return xsubBList;
	}
}

    如上文所说,父类(图像)表示一个抽象的图像概念,其下分为具体的照片图像和附件图像,而人员信息同时具体照片图像列表和附件资料列表。一般来说,这个继承结构是正确的,但是这种引用关系并不被Hibernate所接受,在程序运行中,Yx类会提示一个找不到所mappBy的属性(yx)的错误,即Hibernate不会找到父类上对于Yx的引用设置。

    这个问题,在Hibernate的官方论坛上(07年回复)中找到这样一个回复,随附如下:

https://forums.hibernate.org/viewtopic.php?f=9&t=968594 写道
Emmanuel communicated the following to me, and I figured it made sense to post it here since it is directly relevant (hopefully he won't mind):

Quote:
I did not properly understood the forum case hence the "unless you're not explaining all the details" :-)
What you can do could be possible (need to be tested) if the superclass was mapped with @MappedSuperclass, because in this case the FK is held by the entity class. But in your case, the FK is held by the superclass table, so from the relational POV, you have an association between the associated entity and the superclass, which is not what is described in your one to many association. I thought a lot about supporting this kind of case, but right now, I think it would be a bad thing to support: I like the consistency between the object model and the relational one.

Personally, I naturally assumed that you could map a relationship to a subclass using mappedBy on a superclass, even if the superclass is an entity. At least that's more like the way OO inheritance behaves. I recall changing to MappedSuperclass has other effects (at least w/ pure JPA), such loss of ability to do polymorphic queries. IMHO, seems it would be better to make the decision to go with MappedSuperclass versus Entity based on that kind of concern, not how you've set up the inheritance hierarchy. I can relate to wanting to keep things consistent, it's just that it seems like it should work as a few of us expected--so it takes time to figure out why it doesn't and how to work around it.

Instead of using MappedSuperclass, I chose to leave the superclass as an entity, make the accessors in the superclass abstract, and implement them in the subclass. Seems a bit duplicative, but it works and retains the consistency Emmanuel likes.

   没仔细明白所说的意思,我想估计是认为,关系在一对多时引用的子类,但是在多这一方的关系是由父类来进行维护的,双方的关系没有一致性,虽然在oo设计中,这是一种常用的方式。

    文件提到了用MappedSuperclass来支持这种定义,但MappedSuperclass并不满足我们现有的需要,因为它仅是一个属性的复制,其实的内容会分别存储到两个表中(即subA和subB各一张表,父类不再是实体),在最后提到了一种解决方法,即是在父类上设置一个抽象的引用方法,然后在子类中实现这个方法,但是子类的两个方法在Hibernate配置上是相同的。我把它简单修改了一个,不把父类方法作为抽象的,而是用了Transient来表示一个父类方法,在子类上再复写。如下所示:

 

//Xa父类
public class Xa implements Serializable{
	protected Yx yx;

	@Transient
	public Yx getYx() {
		return yx;
	}
}

//子类A
public class XsubA extends Xa{
	@ManyToOne
	@JoinColumn(name = "yx_id")
	public Yx getYx() {
		return yx;
	}
}

//子类B
public class XsubB extends Xa{
	@ManyToOne
	@JoinColumn(name = "yx_id")
	public Yx getYx() {
		return yx;
	}
}

 

这样反而就OK了,虽然属性写得有点重复,但在这种情况下,好像还没办法。

分享到:
评论

相关推荐

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    用Hibernate映射继承关系

    这通常通过`@OneToMany`注解实现,可以设置`mappedBy`属性来指定关联的另一端。 - **多对多(Many-to-Many)映射**:两个实体之间存在多对多的关系,如学生可以选择多门课程,课程也可以被多个学生选择。使用`@...

    Hibernate注解jar包

    - `@OneToOne`:一对一关联,可设置`mappedBy`属性表示被关联方。 - `@ManyToOne`:多对一关联,通常与`@JoinColumn`结合使用。 - `@OneToMany`:一对多关联,可通过`mappedBy`指定被关联方,或通过`@JoinColumn`...

    Hibernate 注解说明文档

    2. **@OneToMany**: 一对多关联,可以指定`mappedBy`属性,表明在另一方实体类中有引用。 3. **@ManyToOne**: 多对一关联,通常与`@JoinColumn`配合使用,指定外键列。 4. **@ManyToMany**: 多对多关联,通常通过...

    Hibernate权限管理例子

    在Hibernate中,我们可以创建对应的实体类,并使用注解来描述它们与数据库的映射关系。例如: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;...

    hibernate set 集合映射

    4. **集合属性映射**:在实体类中,集合属性需要使用`@OneToMany`或`@ManyToMany`注解进行声明,并通过`mappedBy`指定反向关联的属性。 ```java @Entity public class User { @OneToMany(mappedBy = "user") ...

    hibernate-annotations-3.4.0.jar

    4. **继承关系注解**:通过`@Inheritance`和`@DiscriminatorColumn`注解,可以实现单表继承或多表继承策略,使得子类实例的数据可以存储在同一张表或不同的表中。例如: ```java @Inheritance(strategy = ...

    hibernate_annotations API中文

    这里`mappedBy`指定了关联的反向属性,表示订单中的`user`属性引用了当前用户实体。 五、继承映射(Inheritance Mapping) Hibernate支持单表继承(Single Table Inheritance)、联合继承( Joined Table ...

    hibernate中many2many映射

    在这里,`mappedBy`属性用于指定反向关联的属性名称,通常在另一个实体类中。`@JoinTable`与XML映射文件中的`&lt;join-table&gt;`元素相对应。 ### 4. 数据库配置 在Hibernate配置文件(如`hibernate.cfg.xml`)中,需要...

    hibernate 中文帮助文档

    使用 `@OneToOne` 注解定义一对一关系,可以指定 `mappedBy` 属性让一方作为关系的拥有者。 ### 2. 一对多 `@OneToMany` 用于定义一对多关系,可以通过 `@JoinColumn` 或 `@JoinTable` 定义外键。 ### 3. 多对一 ...

    Hibernate考试题.pdf

    非实体类型用`@Embeddable`,继承关系用`@Inheritance`,其`strategy`属性定义映射策略,双向关联关系不维护外键的属性为`@OneToMany`的`mappedBy`,级联操作的属性为`@Cascade`,乐观锁的属性为`@Version`。...

    hibernate对应关系详解

    使用`@OneToMany`注解,可以通过`mappedBy`属性指定多的一方维护关系,或者在一方使用`@JoinColumn`指定外键。 3. **多对一(Many-to-One)**:多个实体可以关联到一个实体,例如多个学生属于一个班级。使用`@...

    hibernate 一对一 多对多的关系

    `mappedBy`属性表示反向关联,即Student类中的courses属性是Course类中的students属性的反向关联。 ### 知识点拓展 - **CascadeType**: Hibernate提供了多种级联操作,如`CascadeType.ALL`,意味着当删除或更新父...

    hibernate常见异常针对于jpa

    - `mappedBy`属性用于指定另一端的关联属性,它决定了关联关系的维护方。如果双方都声明了关联关系,则会导致不必要的数据更新操作。 #### 五、不需要持久化的属性加@Transient 在某些情况下,可能希望将某些属性...

    hibernate一对一的两种实现方式

    本篇文章将详细探讨Hibernate中一对一关联的两种实现方式:基于主键关联和基于外键关联,并通过源码分析及实际应用示例来阐述它们的工作原理和配置细节。 一、基于主键关联 1.1 基本概念 基于主键关联是指两个实体...

    Hibernate Annotations Reference 中文参考手册HTML版

    @OneToMany(mappedBy = "owner") private Set&lt;Address&gt; addresses; ``` 7. **级联操作**:`CascadeType` 决定了实体间的操作传播,如 `CascadeType.ALL` 表示父实体的增删改查都会影响子实体。 8. **懒加载和...

    Hibernate Annotation 学习笔记

    `mappedBy`属性用于指定被引用方的属性名。 - **一对多关联 (@OneToMany)**: 表示一个实体可以关联多个其他实体。`@JoinColumn`用于指定外键所在的列,`fetch = FetchType.LAZY`控制加载策略,可选择懒加载或立即...

    最全的Hibernate Annotation API文档

    在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...

    hibernate-annotations-3.4.0.GA

    2. 一对多关系:`@OneToMany`表示一个实体对应多个实体,可以通过`mappedBy`指定反向关联。 3. 多对一关系:`@ManyToOne`表示多个实体对应一个实体,`@JoinColumn`用于指定外键列。 4. 多对多关系:`@ManyToMany`...

Global site tag (gtag.js) - Google Analytics