java - 如何通用设置属性配置?

标签 java hibernate jpa spring-data

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 生成方面做正确的事情。尝试将 @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;
}
}

最佳答案

您覆盖最终类中的 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
    ....
}

关于java - 如何通用设置属性配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26948403/

相关文章:

java - 可以同时使用 Hibernate 和 Tomcat 连接池吗?

java - 我得到了 org.hibernate.hql.internal.ast.QuerySyntaxException : is not mapped exception

mysql - 使用spring boot Jpa插入mysql不工作

java - JPA + Hibernate - 如何在不获取该实体的情况下获取子实体的 FK?

java - 将数据库更改与 hibernate 映射文件同步的最佳实践

java - 2个字的字谜

java - 我可以从 FragmentActivity 或 Fragment 创建并显示 DatePickerFragment 吗?

java - Intellij java.class模板修改

java - 通过 ArrayList 扫描具有相同字段的对象

java - 使用 Hibernate 更新查询性能