我在用户和角色之间有多对多的关系
用户实体:
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Entity
@Data
@EqualsAndHashCode(callSuper = false, exclude = {"roles"})
@ToString( exclude = {"roles"})
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String lanId;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private Set<UserRole> roles = new HashSet<>();
public User(String lanId) {
this.lanId = lanId;
}
// Utility Method to sync on both sides
public void addRole(Role role, boolean isPrivileged) {
UserRole userRole = new UserRole();
userRole.setUser(this);
userRole.setRole(role);
userRole.setPrivileged(isPrivileged);
roles.add(userRole);
role.getUsers().add(userRole);
}
}
角色实体:
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Entity
@Data
@EqualsAndHashCode(callSuper = false, exclude = {"users"})
@ToString( exclude = {"users"})
@NoArgsConstructor
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String roleName;
@OneToMany(mappedBy = "role" ,cascade = CascadeType.ALL)
private Set<UserRole> users = new HashSet<>();
public Role(String roleName) {
this.roleName =roleName;
}
}
用户角色实体:
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Entity
@Data
@EqualsAndHashCode(callSuper = false ,exclude = {"privileged"})
@NoArgsConstructor
public class UserRole implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@ManyToOne
private User user;
@Id
@ManyToOne
private Role role;
private boolean privileged;
}
服务等级:
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.sample.m2m.dto.RolesDto;
import com.sample.m2m.repository.Role;
import com.sample.m2m.repository.RoleRepository;
import com.sample.m2m.repository.User;
import com.sample.m2m.repository.UserRepository;
@Service
public class SampleService {
@Autowired
private UserRepository userRepo;
@Autowired
private RoleRepository roleRepo;
public void addEntity(String lanId,List<RolesDto> roles) {
// adding roles to DB first
addNewRoles(lanId,roles);
addUserRole(lanId,roles);
}
@Transactional
public void addNewRoles(String lanId,List<RolesDto> roles) {
//Set<String> roles = Set.of("admin", "read","write");
// Set<String> roles = Set.of("opr");
Set<Role> roleSet = new HashSet<Role>();
for(RolesDto role :roles)
{
Role roleDB = roleRepo.findByRoleName(role.getRoleName());
if(roleDB ==null) {
roleDB = new Role(role.getRoleName());
roleSet.add(roleDB);
}
}
roleRepo.saveAll(roleSet);
}
@Transactional
public void addUserRole(String lanId,List<RolesDto> roles) {
//Set<String> roles = Set.of("admin", "read","write");
//Set<String> roles = Set.of("opr");
User userDB = userRepo.findByLanId(lanId);
if(userDB == null) {
userDB = new User(lanId);
for(RolesDto role : roles) {
Role roledb = roleRepo.findByRoleName(role.getRoleName());
userDB.addRole(roledb, true);
}
}
else
{
for(RolesDto role : roles) {
Role roledb = roleRepo.findByRoleName(role.getRoleName());
userDB.addRole(roledb, true);
}
}
userRepo.save(userDB);
}
}
样本输入: 1:首次储蓄-成功
{
"lanId":"ABC123",
"roles" :[{
"roleName" : "opr"
}
]
}
示例输入2:向同一用户保存其他角色-失败
{
"lanId":"AB123",
"roles" :[{
"roleName" : "admin"
},{
"roleName" : "read"
},
{
"roleName" : "write"
}
]
}
异常:(尝试在链接实体中的用户和角色中插入null)
2020-09-18 11:12:34.379 DEBUG 24862 --- [nio-8080-exec-5] org.hibernate.SQL :
select
userrole0_.user_id as user_id2_2_0_,
userrole0_.role_id as role_id3_2_0_,
userrole0_.privileged as privileg1_2_0_
from
pam.user_role userrole0_
where
userrole0_.user_id=?
and userrole0_.role_id=?
2020-09-18 11:12:34.379 TRACE 24862 --- [nio-8080-exec-5] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1739260]
2020-09-18 11:12:34.379 TRACE 24862 --- [nio-8080-exec-5] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [BIGINT] - [1739261]
2020-09-18 11:12:34.393 ERROR 24862 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: A different object with the same identifier value was already associated with the session : [com.sample.m2m.repository.UserRole#UserRole(user=null, role=null, privileged=true)]; nested exception is javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.sample.m2m.repository.UserRole#UserRole(user=null, role=null, privileged=true)]] with root cause
javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.sample.m2m.repository.UserRole#UserRole(user=null, role=null, privileged=true)]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:123) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
在用户实体的映射或实用方法中是否缺少某些内容。非常感谢您的帮助。
也尝试保存角色,在用户实体中的addroid函数中更改角色后,您还没有存储角色。
UserRole属性不是表的主ID,因此@ID不应位于这2个属性上。
您应该向UserRole添加一个ID属性,并用@ID和@GeneratedValue对其进行注释。
@ManyToOne将在数据库中产生一个外键
问题内容: 问题在标题中: 如何将多对多关系表作为实体? 问题答案: 我会说,你的问题很合理。看看这个文档部分:第24章最佳实践。摘录: 不要使用外来关联映射: 真正的多对多关联的实际测试案例很少见。大多数时候,您需要存储在“链接表”中的其他信息。在这种情况下,最好将两个一对多关联用于中间链接类。实际上,大多数关联是一对多和多对一的。因此,在使用任何其他关联样式时,您应谨慎进行。 我们正在处理的方
救命啊!我只在一对多关系数据库中插入POJO时遇到问题。我有POJO和误解如何插入数据库中的所有列表??? 请帮帮我伙计们!
我有两个实体类订单和产品具有多对多关系(多个订单可能具有相同的产品,只要库存不是空的,并且一个订单可能包含多个产品)如下: 以下是用于插入订单和产品的Dao。产品是预定义的,我只需要更新它们的数量。订单将作为新订单插入。必须生成product\u order relationship表,并将数据作为order和product中的主键插入。 在这个场景中,数据被正确地插入到所有三个表中。但当我尝试插
我希望在消费者和政策这两个实体之间建立一对多关系。一个消费者应该有几个政策。 这是我想要的一个消费JSON对象的例子: 这就是我到目前为止所做的: 政策实体 消费者实体 我想没那么难,但我已经试了几个小时了,还是做不到。我刚到Spring,所以如果有人能帮助我,我会非常感激!
我是Spring和冬眠的新手,遇到了一个几天都解决不了的问题。 在我的项目中,我在服务器和用户实体之间使用多对多关系。一个用户可以存在于多个服务器上。 我的想法是:服务器 创建表的代码: 这是我的课程的样子: 当我初始化数据时,这很有效。我创建了一个服务器对象,并在其中填充了用户,所有内容都正确保存了。 但是当我试图保存一个包含已经在users表中的用户的服务器时,我遇到了问题(如果我从数据库中级
我在Spring Data JPA中有两个实体: 目标是获取与user\u id相关的所有税款: User.java 税务ayment.jva 我不想要一个太多的注释从User.java和列映射在纳税user_id。 规格等级如下: 根据我获取所有与user\u id相关的税款的目标,规范是正确的还是错误的?