`

hibernate 表设计,关系维护说明 mappedby

阅读更多
hibernate 表关系的维护 主要通过如@oneToOne等标签标记。在这些关系中,重要的是mappedby的设置。

如:
 
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE,     
    CascadeType.REMOVE }, mappedBy="user", fetch = FetchType.LAZY)
	@JoinColumn(name = "location_id", referencedColumnName = "id")
	private UserLocation location;
	
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, 
    CascadeType.REMOVE }, mappedBy="user", fetch = FetchType.LAZY)
	@JoinColumn(name = "userinfo_id", referencedColumnName = "id")
	private Userinfo userinfo;
	
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH, 
   CascadeType.MERGE }, mappedBy = "user", fetch = FetchType.LAZY)
	@OrderBy("id asc")
	private List<Album> albums;
  


这三个属性,都设置了mappedBy,则说明他和这三个实体UserLocation, Userinfo, Album之间的关系由这三个实体中来维护,‘维护’的意思是说,这三个实体会出现与user的关联关系字段,既user_id(字段名称取决于mappedBy对应user在三个实体中对user_id起的具体名字)。 同时,user_id这个关系字段的增加、删除、修改均由三个实体发起,不能由User发起。
   如:
  
public Userinfo getUserinfo() {
		if (userinfo == null){
			userinfo = new Userinfo();//CascadeType.PERSIST
			userinfo.setUser(this);//mappedby user, set "user_id" in userinfo
		}
		return userinfo;
	}

public List<Album> getAlbums() {
		if (albums == null){
			Album headAlbum = new Album();
			headAlbum.setUser(this);
			
			albums = new ArrayList<Album>();
			albums.add(headAlbum);
		}
		return albums;
	}
      
public UserLocation getLocation() {
		if (location == null){
			location = new UserLocation();
			location.setUser(this);
		}
		return location;
	}

在三个实体中分别定义User

UserLocation:
	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, fetch = FetchType.LAZY)
	@JoinColumn(name = "user_id", referencedColumnName = "id")
	private User user;

UserInfo:
@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, fetch = FetchType.LAZY)
	@JoinColumn(name = "user_id", referencedColumnName = "id")
	private User user;

Album:
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.LAZY, mappedBy = "album", targetEntity = UserPhoto.class)
	@OrderBy("rank asc")
	private List<UserPhoto> photos;


然后对这些属性进行设置:
//transfer UserinfoDto to userinfo
		if (userinfo != null){
			userinfo.toObject(user.getUserinfo());
		}

		// create user photo wall Album
		user.getAlbums();
		
		if (location != null) {
			location.toObject(user.getLocation());
		}


如果去掉user中 userinfo中的定义 mappedBy="user",则各自维护自己的关系,那么
user表中会有userinfo_id值,userinfo中有user_id. 当设置了user.setUserinfo(new Userinfo()), 则会在user中设置userinfo_id, 设置了userinfo.setUser(user),则对应。

标签@JoinColumn(name = "userinfo_id", referencedColumnName = "id") ,userinfo_id为在user表中外键,对应userinfo表中的id主键。如果不需要在user中有userinfo的id,则删除该标签
分享到:
评论

相关推荐

    mappedBy属性:one2many

    `mappedBy`属性是Hibernate中用于定义关联关系的一个关键元素,尤其是在处理双向关联的一对多关系时。通常,一对多关系意味着一个实体(例如"部门")可以有多个关联的实体(例如"员工")。在这个场景中,部门是一方...

    hibernate的对应关系

    **hibernate的一对一映射关系** 在Hibernate框架中,一对一(One-to-One)映射是一种常见的对象关系映射方式,它表示两个实体类之间存在一个唯一的对应关系。例如,一个用户只有一个身份证,或者一辆车只有一个车牌...

    Hibernate注解 关联关系映射注解.docx

    总的来说,Hibernate的注解提供了强大的灵活性来处理不同类型的关联关系,而`mappedBy`属性是其中的关键,它帮助我们定义关联关系的维护权,使得ORM过程更加清晰和高效。正确理解和使用这些注解,可以极大地提升开发...

    Hibernate表关系总结(一对一,多对一,多对多)

    `mappedBy`属性用于指定维护端,即负责保存关联关系的实体。例如,在上面的`User`和`Group`例子中,`Group`是维护端,`User`是被维护端。 总的来说,理解并熟练运用这些关系映射技术是使用Hibernate进行数据库操作...

    Hibernate各种表关系映射配置详解

    在Hibernate中,我们通常通过在一方的类中添加`@OneToOne`注解,并指定`mappedBy`属性来映射到另一方的主键。例如,Person类的配置可能是这样的: ```java @Entity public class Person { @Id private int id; ...

    hibernate 关系注解

    以下是关于Hibernate关系注解的详细说明: 1. **一对一外键关联映射(单向)** 使用`@OneToOne`注解实现一对一关系,其中一方通过外键引用另一方。`@JoinColumn`用于指定外键的名称,`unique=true`确保外键的唯一...

    hibernate的多种映射关系

    通过 `mappedBy` 参数在 `@OneToMany` 或 `@ManyToMany` 注解中,可以指定关系的维护方,从而简化代码并提高效率。 9. **联合主键 (Composite Key)** 当一个表的主键由两个或更多列组成时,需要使用联合主键。在 ...

    hibernate对应关系详解

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

    Hibernate ORM - 多对多双向连接表关联关系

    这里的`mappedBy`属性表示`Course`类中的属性是主关联端,Hibernate会自动处理中间表的维护。 3. **中间表配置**:虽然大多数情况下Hibernate会自动创建中间表,但你也可以通过`@JoinTable`注解自定义中间表的细节...

    用Hibernate映射继承关系

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

    hibernate关联关系总结

    Hibernate关联关系是Java持久化框架Hibernate中的核心概念,它允许我们在数据库中建立对象之间的关系映射,以便在程序中操作对象时,可以自动处理与数据库的交互。本篇将深入探讨Hibernate的四种主要关联关系:一对...

    Hibernate-单向关系Hibernate-单向关系

    在Java的持久化框架Hibernate中,单向关系是一种常见的实体关联方式,它涉及到两个实体类之间的关系,但这种关系只在一个方向上可见。在本文中,我们将深入探讨Hibernate中的单向关系,包括其概念、类型、配置以及...

    Hibernate_关联关系映射配置

    此外,还可以设置`mappedBy`属性,表示由被引用的一方维护关联关系。 三、多对一(Many-to-One) 与一对一相反,多对一表示多个实体可以关联到单个实体,例如多个订单可以关联到同一个客户。通过`@ManyToOne`注解...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) @JsonIgnore private List&lt;Address&gt; addresses; // 在Address类中 @ManyToOne @JoinColumn(name = "user_id", nullable = false)...

    hibernate 多表关联 中间表

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。在处理多表关联时,Hibernate提供了一种高效且灵活的方法,尤其是当涉及到中间表的情况。中间表...

    hibernate 映射关系学习入门 多对多实体映射

    4. `mappedBy`属性:在`Course`类中,`students`属性使用`mappedBy`指明其外键由`Student`类的`courses`属性维护。 五、操作多对多关系 在实际应用中,我们可以通过Hibernate提供的API来添加、删除和查找多对多关系...

    hibernate动态生成表结构

    总结,Hibernate的动态生成表结构功能极大地方便了开发过程,减少了手动创建和维护数据库表的工作量。通过正确配置实体类和映射关系,我们可以轻松地管理和操作复杂的数据库结构。在实际项目中,根据需求选择合适的...

    hibernate各种常用关联关系的基本配置

    在Java的持久化框架Hibernate中,对象关系映射(ORM)是其核心功能之一,它允许开发者用面向对象的方式处理数据库操作。关联关系是ORM中关键的概念,它模拟了现实世界中的实体之间的联系。本篇文章将深入探讨...

    hibernate的表关联操作-hibernate02

    本篇主要围绕"hibernate的表关联操作"展开,通过映射关系来实现对实体类的增删改查,帮助我们深入理解Hibernate的核心机制。 首先,我们要明白什么是表关联。在数据库设计中,关联是表与表之间的连接,通常由外键...

Global site tag (gtag.js) - Google Analytics