【问题标题】:null id generated for composite PK为复合 PK 生成的空 id
【发布时间】:2014-10-12 01:33:35
【问题描述】:

我有下面的表和下面的关系表:,它的组合PK如下:

UserRole.java

@RooJavaBean
@RooJpaEntity(identifierType = UserRolePK.class, versionField = "", table = "UserRole", schema = "dbo")
@RooDbManaged(automaticallyDelete = true)
@RooToString(excludeFields = { "idApplication", "idRole", "idUserName" })
public class UserRole {
}

UserRole_Roo_DbManaged.aj

@ManyToOne
@JoinColumn(name = "IdApplication", referencedColumnName = "IdApplication", nullable = false, insertable = false, updatable = false)
private Application UserRole.idApplication;

@ManyToOne
@JoinColumn(name = "IdRole", referencedColumnName = "IdRole", nullable = false, insertable = false, updatable = false)
private Role UserRole.idRole;

@ManyToOne
@JoinColumn(name = "IdUserName", referencedColumnName = "IdUserName", nullable = false, insertable = false, updatable = false)
private Users UserRole.idUserName;

而且还存在一个PK表:

@RooIdentifier(dbManaged = true)
public final class UserRolePK {}

及其标识符类(UserRolePK_Roo_Identifier.aj)

privileged aspect UserRolePK_Roo_Identifier {

    declare @type: UserRolePK: @Embeddable;

    @Column(name = "IdRole", nullable = false)
    private Long UserRolePK.idRole;

    @Column(name = "IdUserName", nullable = false, length = 16)
    private String UserRolePK.idUserName;

    @Column(name = "IdApplication", nullable = false)
    private Long UserRolePK.idApplication;

我设置要保存的服务对象的方式是:

UserRole userRole= new UserRole();
userRole.setIdApplication(app);
userRole.setIdRole(invited);
userRole.setIdUserName(user);
appService.saveURole(userRole);

app 之前已设置并保存(同一事务),以及 invited >用户个对象。 由于用户(来自具有复合 PK 的 Users 表: IdUserName 这是一个 String ),定义如下,否则不起作用。

@RooJavaBean
@RooJpaEntity(versionField = "", table = "Users", schema = "dbo")
@RooDbManaged(automaticallyDelete = true)
@RooToString(excludeFields = { "quotations", "taxes", "userRoles", "idCompany", "idPreferredLanguage" })
public class Users {

    @Id
    //@GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "IdUserName", length = 16, insertable = true, updatable = true)
    private String idUserName;
}

所以,我得到的错误是:

org.springframework.orm.jpa.JpaSystemException: org.hibernate.id.IdentifierGenerationException: null id generated for:class com.domain.UserRole; nested exception is javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: null id generated for:class com.domain.UserRole

【问题讨论】:

    标签: spring jpa jpa-2.0 spring-data spring-roo


    【解决方案1】:

    试试这个:

    public class UserRole {
       @PrePersist
       private void prePersiste() {
           if (getId() == null) {
               UserRolePK pk = new UserRolePK();
               pk.setIdApplication(getIdApplication());
               pk.setIdRole(getIdRole);
               pk.setIdUserName(getIdUserName());
               setId(pk);
           }
       }
    }
    

    Roo 在 UserRole 实体及其 id 嵌入类上生成字段,但不是同一件事(UserRole.idRole 与 UserRole.id.idRole 不同)。在您的示例中,您填写了 UserRole 字段,但没有填写 id 字段。在实体被持久化之前,此代码会为您生成。

    祝你好运!

    【讨论】:

    • 谢谢@jmvivo,我做到了,但我得到了这个:UnresolvedEntityInsertActions - HHH000437:尝试保存一个或多个与未保存的瞬态实体具有不可为空关联的实体。在保存这些依赖实体之前,必须将未保存的瞬态实体保存在操作中。未保存的临时实体:([com.domain.Users#anco]) 依赖实体:([[com.domain.UserRole#com.domain.UserRolePK@1ec5735a]]) 不可为空的关联:([com.domain .UserRole.idUserName])
    • 谢谢,我解决了这个问题,我所做的是为应用程序、受邀对象和用户对象添加 .saveAndFlush() 而不是简单的 .save(Entity),因此 UserRole 可以使用之前创建的 ID .
    【解决方案2】:

    在我的情况下,如果以下示例尝试在 DB 中持久化,则会引发上述类似的异常:

    EntityExample e = new EntityExample();
    repositoryExample.save(e);
    //throw ex
    

    这是由于缺少需要设置的 id 字段值造成的:

    EntityExample e = new EntityExample();
    e.setId(new EmbeddedIdExample(1, 2, 3));
    repositoryExample.save(e);
    

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 2019-04-22
      • 2011-11-28
      • 2023-03-23
      • 2012-06-09
      • 2020-11-15
      • 2013-10-05
      • 1970-01-01
      相关资源
      最近更新 更多