hibernate - 当实体的主键之间存在关系时,必须在调用save()之前手动分配此类的id

标签 hibernate nhibernate-mapping

我有2个实体,我要在它们之间创建一个关系,使它们都共享其主键。当我们提交一个实体时,另一个实体也应使用为第一个实体生成的相同主键来提交。

我的第一个实体是用户

    @Entity
@Table(name = "ENDUSER")
public class User extends LongIdBase implements IActivatable, IUser {
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
     @OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, targetEntity = UserLoginRecord.class)
    @PrimaryKeyJoinColumn(name = "id")
    private UserLoginRecord userLoginRecord;


我的第二个实体是UserLoginrecord

   @Entity
@Table(name = "ENDUSER_TEMP")
public class UserLoginRecord {
    @Id
    @Column(name = "id")
    private Long id;

    public Long getId() {
        return id;
    }

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

    @Column(name = "name")
    private String name;


我希望当我保留user时,还应使用与User相同的主目录创建UserLoginRecord的新行。

但是,在尝试坚持时,我在下面收到此错误。

ids for this class must be manually assigned before calling save():

最佳答案

之所以会出现该错误,是因为除非指定标识符生成器,​​否则将假定使用“已分配”生成器。分配的标识符希望您手动设置ID,因此我认为您对自动生成ID感兴趣。

尝试将其更改为:

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

用户应该是用户/ userLoginRecord关联的所有者,因此:

@Entity
@Table(name = "ENDUSER")
public class User extends LongIdBase implements IActivatable, IUser {

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

    public Long getId() {
        return id;
    }

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

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

}

我认为用户可以拥有更多的UserLoginRecords,这意味着用户将与UserLoginRecord具有一对多关联,而UserLoginRecord将与User具有多对一关联。
假设您与用户和UserLoginRecord之间存在一对一关系

UserLoginRecord看起来像:

@Entity
@Table(name = "ENDUSER_TEMP")
public class UserLoginRecord {

    @Id 
    @Column(name="userId", unique=true, nullable=false)
    private Long userId;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="userId")
    @MapsId
    private User user;

对于双向一对一关联,用户还可以包含:

    @OneToOne(mappedBy = "user")
    private UserLoginRecord userLoginRecord;


如果您要进行双向关联,请不要忘记在保存之前设置双方:

    user.setUserLoginRecord(userLoginRecord);
    userLoginRecord.setUser(user);


即使userLoginRecord.user端是此关联的所有者,而user.userLoginRecord则是“反向”端。

关于hibernate - 当实体的主键之间存在关系时,必须在调用save()之前手动分配此类的id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24697561/

相关文章:

java - 如何注释 Hibernate 实体以同时支持 Java 和数据模型?

java - 制作主键列 varchar(max) 的替代方法

Nhibernate 有很多插入会生成额外的更新(无反向)

c# - NHibernate映射一对多

java - 与 Spring 一起 hibernate

java - 避免 @onetomany join 中不必要的提取

java - 如何在JPA Spring Boot中的嵌套对象中通过Temporal.TIMESTAMP进行查询?

nhibernate - 将一对一关系映射到错误的(棕地)数据库模式

.net - 为什么 NHibernate 会自动截断而不是在保存时抛出异常?

nhibernate - Fluent nHIbernated - 在同一张表中有许多关系