2014-11-15 110 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(); 
    } 
} 

这里是一个final类如何一般设置属性配置?

@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做一些更新,但实际上我不是接近具有类(或其他外部final类)在AbstractPersistable和最终的类之间,可以用明智的方式做正确的事情。试图移动@GenericGeneratorpackage-info.java但随后停止承认通过该名称

@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

一个产生你在最后一节课覆盖ID:

@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'使得修复名字变得简单(直到写完问题后才发现)。我一直没有找到一种方法来扩展Spring类,以通用的方式添加生成器,而无需将其放入每个最终的类中。 – xenoterracide

+0

值得注意的是,这个答案并没有真正解决我关于uuid世代的问题,我想使其可重用,同时也使用AbstractPersistable – xenoterracide

+0

也许我不明白你想要的是什么:如果你想重用发生器,而不是必须多次注释Id和GenericGenerator,使用这些注释来定义AbstractEntityBase就足够了。然后继承将Id赋予子类Character(它扩展了AbstractEntityBase)。 – rlm