一尘不染

用多余的列映射多对多关联表

hibernate

我的数据库包含3个表:User和Service实体具有多对多关系,并与SERVICE_USER表联接在一起,如下所示:

用户-SERVICE_USER-服务

SERVICE_USER表包含附加的BLOCKED列。

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

@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
}

我遵循以下示例http://giannigar.wordpress.com/2009/09/04/m
… using-jpa /这是一些测试代码:

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);

问题在于,hibernate会保留User对象和UserService之一。CmsService对象未成功

我尝试使用EAGER获取-没有进度

通过上面提供的映射是否可以实现我期望的行为?

也许有一些更优雅的方式来映射带有附加列的多对多联接表?


阅读 361

收藏
2020-06-20

共1个答案

一尘不染

由于SERVICE_USER表不是纯联接表,而是具有其他功能字段(已阻止),因此您必须将其映射为实体,并将User和Service之间的多对多关联分解为两个OneToMany关联:一个用户有多个UserService,一个服务有许多UserServices。

您尚未向我们展示最重要的部分:实体之间关系的映射和初始化(即您遇到问题的部分)。因此,我将向您展示它的外观。

如果使关系是双向的,则应该具有

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>();
}

如果您不对关系进行任何级联,则必须坚持/保存所有实体。尽管仅必须初始化关系的拥有方(在此是UserService方),但是确保双方保持一致也是一种很好的做法。

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);
2020-06-20