3

Hibernate Annotations를 사용하여 엔티티를 매핑하려고합니다. 따라서 레코드가 생성되고 저장 될 때 (캐스케이드를 통해) ID가 자동으로 생성됩니다.hibernate generator가 uniqueidentifier와 함께 삽입하지 않을 것입니다.

...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"매개 변수가 아닙니다.

내 테이블 스키마, 지금은 단순히 : 나는 SQL 서버 2008 R2, Express 버전을 사용하고

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

.

내 주석이 KarmaCharacter, 매핑 된 슈퍼 클래스, DomainEntity 및 구체적인 클래스 사이에 분할됩니다

@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", [email protected](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의 최대 절전 모드와 uniqueidentifer 형 ID의의를 생성 할 수있는 올바른 방법을 말할 수있는 경우 및 그들을 제대로 구할 수있게 해 주시면 감사하겠습니다. uniqueidentifier SQL Server 형식을 사용하는 경우

답변

7

I can see the following insert statement being issued (...). Clearly this is wrong, there is no "id" parameter.

는 사실, Hibernate는 newid()를 사용한다. 그러나 현재의 주석은 그렇게 말하지 않습니다. GUID를 열 유형이 정말 마이크로 소프트의 알고리즘에 의해 생성 된 GUID를 유지하기위한 것입니다

  • , 당신이 Hibernate의 UUID 알고리즘을 사용할 수 없습니다

    :

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

    일부 추가 발언 : 나는 당신이 여기에 guid 발전기를 필요가 있다고 생각 .

  • IdGenerated 특수 효과가 필요하지 않습니다. 그냥 제거하면됩니다.
  • 나는 왜 당신이 "엉망"이라 생각하는지 궁금하다. AccessType, 나는 단지 그것들을 제거 할 것이다.
  • 실제로 GUID는 사용하지 않지만 (참조) 다른 이야기입니다.
+0

감사합니다. 그게 정확히 내가 원하는, 나는 최대 절전 모드 newid()를 사용하는 방법을 몰랐다. – RMorrisey

+0

setId() 메서드가 없으므로 @AccessType을 사용합니다. ID를 변경하려면 응용 프로그램 코드가 필요하지 않기 때문에이 방법을 사용했습니다. – RMorrisey

+0

@R 모리시 : 알겠습니다 (하지만 저는 그 세터를 보호 할 것입니다) –

관련 문제