gpt4 book ai didi

java - Jpa多对多我怎样才能将数据插入2个表

转载 作者:搜寻专家 更新时间:2023-11-01 03:37:32 24 4
gpt4 key购买 nike

我有一些问题。

我有 3 个表:

users (id, name, ..)
roles (id, name)
user-role (user_id, role_id)

当我建立多对多关系并执行 save() 时,我有 3 个插入。

用户:

@Entity
@Table(name = "user")
public class User implements Serializable {

public static final String UK_EMAIL = "uk_email";

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "system_user_role",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = id")}
)
private List<SystemRole> userRole;

public List<SystemRole> getUserRole() {
return userRole;
}

系统角色;

@Entity
@Table(name = "system_role")
public class SystemRole implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column
private String name;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "system_user_role",
joinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}
)
private List<User> users;

public List<User> getUsers() {
return users;
}

public void setUsers(List<User> users) {
this.users = users;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

请告诉我,我可以只将数据插入 2 个表,只插入(用户和用户角色吗?我有角色列表,创建新用户时不需要添加新角色。

所以,当我这样做时:

SystemRole role1 = systemRoleService.findOne("ROLE_ADMIN");
userForm.setUserRole(Lists.newArrayList(role1));
....
final User saved = userRepository.save(user);
....

我得到一个错误:

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to  persist:...

如果我这样做:

@Service("userService")
@Transactional
public class UserServiceImpl implements UserDetailsService, ResourceService<User> {
private final static Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);

@Autowired
private UserDAO userRepository;
@Autowired
private SystemRoleDAO systemRoleRepository;

@Override
@Transactional(rollbackFor = ResourceException.class)
public User create(User user) throws ResourceException {
try {
SystemRole role1 = systemRoleRepository.findOne(6l);
user.setUserRole(Lists.newArrayList(role1));

user.setId(62l); // !!! if set user ID - it works CORRECT

final User saved = userRepository.save(user);
return saved;
} catch (DataIntegrityViolationException ex) {
...

用户DAO:

@Repository
public interface UserDAO extends JpaRepository<User, Long> {
...

SystemRoleDAO:

@Repository
public interface SystemRoleDAO extends JpaRepository<SystemRole, Long> {

它有效,但我有 3 个插入物。

当我创建一个新用户时,我需要从列表中选择一个角色,将其添加到用户并保存新用户。

非常感谢。

最佳答案

@实体@Table(name = "用户")

公共(public)类用户实现序列化{

public static final String UK_EMAIL = "uk_email";

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) //Make CascadeType.Detached this should solver your problem
@JoinTable(
name = "system_user_role",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = id")}
)
private List<SystemRole> userRole;

public List<SystemRole> getUserRole() {
return userRole;
}

关于java - Jpa多对多我怎样才能将数据插入2个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26295445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com