我的数据库包含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获取-没有进度
通过上面提供的映射是否可以实现我期望的行为?
也许有一些更优雅的方式来映射带有附加列的多对多联接表?
由于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);