2014-11-15 2 views
0
package com.xenoterracide.rpf.model.abstracts; 
import org.hibernate.annotations.Generated; 
import org.hibernate.annotations.GenerationTime; 
import org.springframework.data.domain.Persistable; 
import javax.persistence.Column; 
import javax.persistence.GeneratedValue; 
import javax.persistence.MappedSuperclass; 
import javax.validation.constraints.NotNull; 
import java.util.UUID; 

@MappedSuperclass 
public abstract class AbstractEntityBase extends AbstractPersistable<UUID> implements Persistable<UUID> { 
    // AbstractPersistable is a Copy of the Spring Data JPA version testing to see if I can fix this problem, 
    // also bug DATAJPA-622, plan to implement the spring variant if I can get it working with UUID 

    @NotNull 
    @Override 
    @Generated(GenerationTime.ALWAYS) 
    @GeneratedValue(generator = "entityIdGenerator") 
    @Column(columnDefinition = "uuid", updatable = false) 

    public UUID getId() { 
     return super.getId(); 
    } 
} 

여기에 최종 클래스일반적으로 속성 구성을 설정하는 방법은 무엇입니까?

@Entity 
@Table(name = "characters") 
class Character extends AbstractEntityBase { 
String name; 

@Override 
@Column(name = "character_id") 

public UUID getId() { 
    return super.getId(); 
} 

입니다하지만 난이 오류가

Caused by: org.hibernate.MappingException: Duplicate property mapping of id found in com.xenoterracide.rpf.model.character.Character 
at org.hibernate.mapping.PersistentClass.checkPropertyDuplication(PersistentClass.java:515) 
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:505) 
at org.hibernate.mapping.RootClass.validate(RootClass.java:270) 
at org.hibernate.cfg.Configuration.validate(Configuration.java:1358) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1849) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 

내가 AbstractPersistable의 ID가 제대로 UUID를하고 내가 원하는 열 이름을 갖도록 구성 할 수 있습니까? 내 마지막 클래스에 중복 된 주석을 AbstractPersistable를 사용하는 것이 바람직 요구하지 않는 동안

갱신 나는 @AttributeOverride를 통해 일부 업데이트를 수행하는 관리했지만 현실적으로 나는 (최종 클래스 또는 다른 외부) 클래스를 가지고 가까이하지 않다 AbstractPersistable과 Uuid 세대를 현명하게 할 수있는 최종 클래스 사이. 내 package-info.java@GenericGenerator를 이동하려고하지만 그것은 당신이 마지막 클래스의 ID를 오버라이드 (override) 그 이름

@Entity 
@Table(name = "characters") 
@GenericGenerator(name = "uuid-generator", strategy = "uuid2") 
@AttributeOverride(
    name = "id", 
    column = @Column(
      name = "character_id", 
      insertable = false, 
      updatable = false, 
      unique = true, 
      nullable = false 
    )) 
class Character extends AbstractPersistable<UUID> implements Persistable<UUID> { 
String name; 

protected Character(final String name) { 
    this.name = name; 
} 

@SuppressWarnings("unused") 
protected Character() { 
} 

@Id 
@Override 
@Generated(GenerationTime.ALWAYS) 
@GeneratedValue(generator = "uuid-generator") 
public UUID getId() { 
    return super.getId(); 
} 

@NotNull 
@SuppressWarnings("unused") 
protected String getName() { 
    return name; 
} 

@SuppressWarnings("unused") 
protected void setName(String name) { 
    this.name = name; 
} 
} 

답변

2

를 통해 생성 인식 중지 :

@Override 
@Column(name = "character_id") 
public UUID getId() { 
    return super.getId(); 
} 

당신은 단지 상속이 그것을 할 수 있도록 할 수 있습니다! 따라서 최종 클래스는 다음과 같아야합니다.

@Entity 
@Table(name = "characters") 
class Character extends AbstractEntityBase { 
String name; 
} 

getId()는 AbstractEntityBase 클래스에서 상속됩니다. uuid 열과 이름 열을 갖게됩니다.

업데이트 : Spring에서 : "AbstractPersistable은 매우 기본적인 사용 사례를위한 원 스톱 샵입니다. 실제로는 기본 ID 생성을 설정하는 것입니다. 사용자 정의하려는 경우 확장 할 수있는 게 없습니다. 클래스." 클래스 AbstractEntityBase가 Persistable을 직접 구현해야하므로 문제가 해결됩니다.

@MappedSuperclass 
public abstract class AbstractEntityBase implements Persistable<UUID> { 

    @Generated(GenerationTime.ALWAYS) 
    @GeneratedValue(generator = "entityIdGenerator") 
    @Column(columnDefinition = "uuid", updatable = false) 
    private UUID id; 

    // implements methods like hashcode or equals 
    .... 
} 
+0

마지막 등급에서만 가능합니까? 내 진짜 문제는 '이름'이 아니라 '발전기'입니다. 'AttributeOverride'는 이름을 쉽게 고칠 수있게합니다. (질문을 쓸 때까지 찾지 못했습니다.) Generator를 추가하기위한 일반적인 방법으로 Spring 클래스를 확장 할 수있는 방법을 찾지 못했지만 모든 최종 클래스에 넣지 않았습니다. – xenoterracide

+0

이 대답은 정말 내 문제를 해결하는 것은 아닙니다. 다시 말해서 AbstractPersistable을 사용하면서 재사용 가능하게 만들고 싶습니다. – xenoterracide

+0

아마 내가 원하는 것을 정확히 이해하지 못할 수도 있습니다. 생성자를 재사용하고 싶지 않을 수도 있습니다. 어노테이션 ID와 GenericGenerator를 여러 번 넣어야하며,이 어노테이션으로 AbstractEntityBase를 정의하면 충분합니다. 그리고 나서 상속은 이드에게 하위 클래스 Character (AbstractEntityBase를 확장)에 줄 것이다. – rlm

관련 문제