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;
}
}
마지막 등급에서만 가능합니까? 내 진짜 문제는 '이름'이 아니라 '발전기'입니다. 'AttributeOverride'는 이름을 쉽게 고칠 수있게합니다. (질문을 쓸 때까지 찾지 못했습니다.) Generator를 추가하기위한 일반적인 방법으로 Spring 클래스를 확장 할 수있는 방법을 찾지 못했지만 모든 최종 클래스에 넣지 않았습니다. – xenoterracide
이 대답은 정말 내 문제를 해결하는 것은 아닙니다. 다시 말해서 AbstractPersistable을 사용하면서 재사용 가능하게 만들고 싶습니다. – xenoterracide
아마 내가 원하는 것을 정확히 이해하지 못할 수도 있습니다. 생성자를 재사용하고 싶지 않을 수도 있습니다. 어노테이션 ID와 GenericGenerator를 여러 번 넣어야하며,이 어노테이션으로 AbstractEntityBase를 정의하면 충분합니다. 그리고 나서 상속은 이드에게 하위 클래스 Character (AbstractEntityBase를 확장)에 줄 것이다. – rlm