2014-10-12 2 views
1

У меня есть следующие таблицы enter image description here и следующая таблица отношений тоже: enter image description here, которая имеет композитную 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 

ответ

4

Попробуйте это:

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); 
     } 
    } 
} 

Роо генерирует поля на UserRole объекта и его id встроенный класс, но это не то же самое (UserRole.idRole - это не то же самое, что UserRole.id.idRole). В вашем примере вы заполняете поля UserRole, но не поля id. Этот код делает это для вас до того, как объект будет сохранен.

Удачи вам!

+0

Спасибо, @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

+0

спасибо, я исправить проблему, что я сделал, это добавить .saveAndFlush() вместо простого .save (Entity) для приложений, приглашенных и пользовательских объектов , поэтому UserRole может использовать идентификаторы, созданные ранее. – Jrr

 Смежные вопросы

  • Нет связанных вопросов^_^