我在微服务架构(注册表,网关,uaa服务器)中使用JHipster。我使用配置文件实体在uaa服务器中扩展了默认的jhipster用户(根据本文https://www.jhipster.tech/tips/022_tip_registering_user_with_additional_information.html使用@mapsId批注和一对一关系)。
我的问题如下:如果我在jhipster网关中注册了一个新用户,则会创建我的个人资料,并使用该用户和个人资料之间的共享ID将其写入数据库,一切正常。现在,如果我想删除配置文件实体,也应该删除该用户实体(因为没有配置文件的用户),但是我得到以下异常:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
scrollView.setOnScrollChangeListener(object : View.OnScrollChangeListener {
override fun onScrollChange(v: View?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {
val x = scrollY - oldScrollY
if (x > 0) {
//scroll up
//show fab icon
} else if (x < 0) {
//scroll down
//hide fab icon
} else {
}
}
})
}
如果删除用户实体,我的个人资料也会被删除,因此级联应该起作用。
用户实体:
org.springframework.orm.ObjectOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
个人资料实体
@Entity
@Table(name = "jhi_user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
...
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
private Profile profile;
使用liquibase的配置文件表的外键约束:
@Entity(name = "Profile")
@Table(name = "profile")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Profile implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
...
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id", referencedColumnName = "id")
@MapsId
private User user;
我在这里想念什么吗?我还尝试使用hibernate批注而不是JPA批注,但没有进行任何更改,因此我认为这可能是Hibernate本身的问题。
答案 0 :(得分:0)
我通过在个人资料表中添加新的“ user_id”列解决了我的问题。我向id列(用户表)和user_id列(配置文件表)添加了外键约束。不完全是我想要的,但是可以。只需确定要在关系的两边都启用级联,以便在删除用户时自动删除配置文件。