генератор гибернации не будет вставлен с помощью уникального идентификатора - PullRequest
3 голосов
/ 20 июня 2010

Я пытаюсь отобразить сущность, используя аннотации Hibernate, чтобы при создании и сохранении записи (через каскад) автоматически создавался идентификатор.При моей текущей настройке (или нескольких других, которые я пробовал) я получаю следующую ошибку:

    ...org.hibernate.exception.ConstraintViolationException: 
could not insert: [com.gorkwobbler.shadowrun.karma.domain.AttributeScore]
    ...java.sql.SQLException: 
Caused by: java.sql.SQLException: Cannot insert the value NULL into column 'id', table 'KARMA_DEV.dbo.Character'; column does not allow nulls. INSERT fails.

Я вижу, как выполняется следующий оператор вставки:

Hibernate: insert into character (version, alias, firstName, lastName) values (?, ?, ?, ?)

Ясно этоневерно, параметр "id" отсутствует.

Моя схема таблиц на данный момент выглядит просто:

Character(
 id uniqueidentifier, --primary key
 alias varchar(max),
 firstName varchar(max),
 lastName varchar(max),
 version int --for hibernate
)

Я использую SQL Server 2008 R2, Express edition.

Мои аннотации разделены между сопоставленным суперклассом DomainEntity и конкретным классом KarmaCharacter:

@MappedSuperclass
public abstract class DomainEntity implements Serializable /* Needed for HOM retainUnsaved */ {
    private static final long serialVersionUID = 1L;
    private String id;
    private Integer version;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Generated(value=GenerationTime.INSERT)
    //@GeneratedValue(generator="hibernate-uuid.hex")
    //@GenericGenerator(name="hibernate-uuid.hex", strategy="org.hibernate.id.UUIDHexGenerator", parameters=@Parameter(name="separator", value="-"))
    @AccessType(value="field")
    public String getId() {
        return id;
    }

    @Version
    @AccessType(value="field")
    public Integer getVersion() {
        return version;
    }
}

@SuppressWarnings("serial")
@Entity
@Table(name="character")
public class KarmaCharacter extends DomainEntity {
    private String alias;
    private String lastName;
    private String firstName;

    private SortedSet<AttributeScore> attributeScores;

    public KarmaCharacter() {
        //default constructor
    }

    @Column
    @AccessType(value="field")
    public String getAlias() {
        return alias;
    }

    @Column
    @AccessType(value="field")
    public String getFirstName() {
        return firstName;
    }

    @Column
    @AccessType(value="field")
    public String getLastName() {
        return lastName;
    }

//...omitted some transient code and a collection property for brevity

    public void setAlias(String alias) {
        this.alias = alias;
    } 

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

Если кто-то может подсказать мне правильный способ создания уникальных идентификаторов типа идентификатора с помощью спящего режима в SQL Server,и получить их должным образом, было бы очень полезно.

1 Ответ

7 голосов
/ 20 июня 2010

Я вижу, как выдается следующий оператор вставки (...).Ясно, что это неправильно, здесь нет параметра «id».

Действительно, при использовании типа uniqueidentifier SQL Server Hibernate должен использовать newid().Но ваши текущие аннотации не говорят об этом.Я думаю, вам нужен генератор guid здесь:

@Id
@GenericGenerator(name = "generator", strategy = "guid", parameters = {})
@GeneratedValue(generator = "generator")
public String getId() {
    return id;
}

Некоторые дополнительные замечания:

  • Тип столбца GUID:на самом деле предназначенный для хранения GUID, сгенерированного алгоритмом Microsoft, вы не можете использовать алгоритм UUID Hibernate.
  • Вам не нужна аннотация Generated для Id, просто удалите ее.
  • Мне также интересно, почему вы «шутите» с AccessType, я бы просто удалил их.
  • Я бы на самом деле не использовал GUID (см. эту статью ), но это другоеистория.
...