为复合PK生成的null id

Jrr*_*Jrr 1 spring jpa spring-roo jpa-2.0 spring-data

我有以下表格 在此输入图像描述 以及以下关系表: 在此输入图像描述,其复合PK如下:

UserRole.java

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

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;
Run Code Online (Sandbox Code Playgroud)

但也存在PK表:

@RooIdentifier(dbManaged = true)
public final class UserRolePK {}
Run Code Online (Sandbox Code Playgroud)

及其标识符类(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;
Run Code Online (Sandbox Code Playgroud)

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

UserRole userRole= new UserRole();
userRole.setIdApplication(app);
userRole.setIdRole(invited);
userRole.setIdUserName(user);
appService.saveURole(userRole);
Run Code Online (Sandbox Code Playgroud)

应用程序已设置并保存(同一事务),以及邀请用户对象.由于user(来自Users表的复合PK:IdUserName是一个String)被定义为follow,否则不起作用.

@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;
}
Run Code Online (Sandbox Code Playgroud)

所以,我得到的错误是:

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
Run Code Online (Sandbox Code Playgroud)

jmv*_*ivo 5

试试这个:

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);
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

Roo正在生成UserRole实体及其id嵌入类的字段,但不是一回事(UserRole.idRole与UserRole.id.idRole不同).在您的示例中,您填写UserRole字段,但不填写id字段.此代码在实体持久化之前为您提供.

祝好运!