用多出的列映射多对多关联表 [英] Mapping many-to-many association table with extra column(s)

查看:116
本文介绍了用多出的列映射多对多关联表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的数据库包含3个表:
用户和服务实体具有多对多关系,并按照以下方式与SERVICE_USER表连接:

USERS - SERVICE_USER - SERVICES



SERVICE_USER表包含额外的BLOCKED列。



执行此类操作的最佳方法是什么映射?
这些是我的实体类

  @Entity 
@Table(name =USERS)
public class User实现java.io.Serializable {

private String userid;
私人字符串电子邮件;

@Id
@Column(name =USERID,unique = true,nullable = false)
public String getUserid(){
return this.userid ;
}

....一些get / set方法
}

@Entity
@Table(name =SERVICES)
public class CmsService实现java.io.Serializable {
private String serviceCode;

@Id
@Column(name =SERVICE_CODE,unique = true,nullable = false,length = 100)
public String getServiceCode(){
return this.serviceCode;
}
....一些额外的字段和get / set方法

我跟着这个例子 http://giannigar.wordpress.com/2009/09/04/m ...使用-JPA /
以下是一些测试代码:

  User user = new User (); 
user.setEmail(e2);
user.setUserid(ui2);
user.setPassword(p2);

CmsService service = new CmsService(cd2,name2);

列表< UserService> userServiceList = new ArrayList< UserService>();

UserService userService = new UserService();
userService.setService(service);
userService.setUser(user);
userService.setBlocked(true);
service.getUserServices()。add(userService);

userDAO.save(user);

问题在于hibernate持久化User对象和UserService对象。 CmsService对象没有成功



我尝试使用EAGER fetch - 没有进展

是否有可能实现我期望的行为与上面提供的映射?

也许有一些更优雅的方式来映射多对多连接表与额外的列?

$由于SERVICE_USER表不是纯粹的连接表,但具有其他功能性字段(被阻止),因此必须将其映射为实体,然后分解用户和服务之间的多对多关联分为两个OneToMany关联:一个用户拥有多个UserServices,一个Service拥有多个UserServices。



您没有向我们展示最多重要的部分:映射和初始化您的实体之间的关系(即您遇到问题的部分)。所以我会告诉你它应该是什么样子。



如果你建立双向关系,你应该有

  class User {
@OneToMany(mappedBy =user)
private Set< UserService> userServices = new HashSet< UserService>();
}

class UserService {
@ManyToOne
@JoinColumn(name =user_id)
private用户用户;

@ManyToOne
@JoinColumn(name =service_code)
私人服务服务;

@Column(name =blocked)
private boolean blocked;
}

class Service {
@OneToMany(mappedBy =service)
private Set< UserService> userServices = new HashSet< UserService>();

$ / code>

如果你没有在关系上放置任何级联,那么你必须坚持/保存所有实体。虽然只有关系的拥有方(这里是UserService方)必须初始化,但确保双方的一致性也是一个好习惯。

  User user = new User(); 
服务服务=新服务();
UserService userService = new UserService();

user.addUserService(userService);
userService.setUser(user);

service.addUserService(userService);
userService.setService(service);

session.save(user);
session.save(service);
session.save(userService);


My database contains 3 tables: User and Service entities have many-to-many relationship and are joined with the SERVICE_USER table as follows:

USERS - SERVICE_USER - SERVICES

SERVICE_USER table contains additional BLOCKED column.

What is the best way to perform such a mapping? These are my Entity classes

@Entity
@Table(name = "USERS")
public class User implements java.io.Serializable {

private String userid;
private String email;

@Id
@Column(name = "USERID", unique = true, nullable = false,)
public String getUserid() {
return this.userid;
}

.... some get/set methods
}

@Entity
@Table(name = "SERVICES")
public class CmsService implements java.io.Serializable {
private String serviceCode;

@Id
@Column(name = "SERVICE_CODE", unique = true, nullable = false, length = 100)
public String getServiceCode() {
return this.serviceCode;
}
.... some additional fields and get/set methods
}

I followed this example http://giannigar.wordpress.com/2009/09/04/m ... using-jpa/ Here is some test code:

User user = new User();
user.setEmail("e2");
user.setUserid("ui2");
user.setPassword("p2");

CmsService service= new CmsService("cd2","name2");

List<UserService> userServiceList = new ArrayList<UserService>();

UserService userService = new UserService();
userService.setService(service);
userService.setUser(user);
userService.setBlocked(true);
service.getUserServices().add(userService);

userDAO.save(user);

The problem is that hibernate persists User object and UserService one. No success with the CmsService object

I tried to use EAGER fetch - no progress

Is it possible to achieve the behaviour I'm expecting with the mapping provided above?

Maybe there is some more elegant way of mapping many to many join table with additional column?

解决方案

Since the SERVICE_USER table is not a pure join table, but has additional functional fields (blocked), you must map it as an entity, and decompose the many to many association between User and Service into two OneToMany associations : One User has many UserServices, and one Service has many UserServices.

You haven't shown us the most important part : the mapping and initialization of the relationships between your entities (i.e. the part you have problems with). So I'll show you how it should look like.

If you make the relationships bidirectional, you should thus have

class User {
    @OneToMany(mappedBy = "user")
    private Set<UserService> userServices = new HashSet<UserService>();
}

class UserService {
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "service_code")
    private Service service;

    @Column(name = "blocked")
    private boolean blocked;
}

class Service {
    @OneToMany(mappedBy = "service")
    private Set<UserService> userServices = new HashSet<UserService>();
}

If you don't put any cascade on your relationships, then you must persist/save all the entities. Although only the owning side of the relationship (here, the UserService side) must be initialized, it's also a good practice to make sure both sides are in coherence.

User user = new User();
Service service = new Service();
UserService userService = new UserService();

user.addUserService(userService);
userService.setUser(user);

service.addUserService(userService);
userService.setService(service);

session.save(user);
session.save(service);
session.save(userService);

这篇关于用多出的列映射多对多关联表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆