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和最终的类之间,可以用明智的方式做正确的事情。试图移动@GenericGenerator
我package-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;
}
}
它是唯一可能在最后一堂课吗?我真正的问题不是“名称”,而是“发电机”。 'AttributeOverride'使得修复名字变得简单(直到写完问题后才发现)。我一直没有找到一种方法来扩展Spring类,以通用的方式添加生成器,而无需将其放入每个最终的类中。 – xenoterracide
值得注意的是,这个答案并没有真正解决我关于uuid世代的问题,我想使其可重用,同时也使用AbstractPersistable – xenoterracide
也许我不明白你想要的是什么:如果你想重用发生器,而不是必须多次注释Id和GenericGenerator,使用这些注释来定义AbstractEntityBase就足够了。然后继承将Id赋予子类Character(它扩展了AbstractEntityBase)。 – rlm