У меня есть следующие таблицы и следующая таблица отношений тоже:
, которая имеет композитную 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);
приложение было установлено и сохранены до (такая же сделка), а также приглашены и объектов. Поскольку пользователь (из таблицы Users с составным PK: IdUserName, который является строкой), определяется следующим образом, иначе он не работает.
@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
Спасибо, @jmvivo, я сделал это, но я получил это:
UnresolvedEntityInsertActions - HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities. \t Unsaved transient entity: ([com.domain.Users#anco]) \t Dependent entities: ([[com.domain.UserRole#[email protected]]]) \t Non-nullable association(s): ([com.domain.UserRole.idUserName])
– Jrrспасибо, я исправить проблему, что я сделал, это добавить .saveAndFlush() вместо простого .save (Entity) для приложений, приглашенных и пользовательских объектов , поэтому UserRole может использовать идентификаторы, созданные ранее. – Jrr