我正在为以下之间的多对多关系构建示例:User(1) - ( )AccessLevel( ) - (1)Role
我已经在 Java 中实现了 3 个具有休眠实现的类,如下所示:
类用户
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue
@Column(name="USER_ID")
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "access_level", joinColumns = {
@JoinColumn(name = "user_id", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "role_id", nullable = false, updatable = false) })
private Set<Role> roles = new HashSet<Role>(0);
类角色
@Entity
@Table(name="role")
public class Role {
@Id
@GeneratedValue
@Column(name="role_id")
private Integer id;
@Column(name="role_name")
private String roleName;
类访问级别
@Entity
@Table(name="access_level")
public class AccessLevel {
@Id
@GeneratedValue
private Integer id;
@Column(name="role_id")
private Integer roleId;
@Column(name="user_id")
private Integer userId;
问题:
当我使用合并方法持久化用户 bean 时,会出现异常:
@Service
public class UserServiceImpl implements UserService {
@PersistenceContext
private EntityManager em;
@Override
@Transactional
public void save(User user) {
em.merge(user);
}
例外
org.springframework.web.util.NestedServletException:请求过程
ing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into access_level (user_id, role_id) values (?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
如您所见,hibernate 正在尝试运行此查询:
insert into access_level (user_id, role_id) values (?, ?)
从我的角度来看,即使我已将 @GeneratedValue 添加到 id 属性,休眠似乎也没有为 AccessLevel 生成主键。
注意: 我正在使用 Postgresql 开发生产环境,使用 HSQL 数据库开发环境,该数据库从一开始就根据实体描述创建所有模式。两种环境都会产生相同的问题。
问候,克里斯蒂安·科罗拉多