Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA重写@MappedSuperclass中定义的@Id_Java_Hibernate_Jpa_Hibernate Mapping_Mappedsuperclass - Fatal编程技术网

Java 使用JPA重写@MappedSuperclass中定义的@Id

Java 使用JPA重写@MappedSuperclass中定义的@Id,java,hibernate,jpa,hibernate-mapping,mappedsuperclass,Java,Hibernate,Jpa,Hibernate Mapping,Mappedsuperclass,我有一个类AbstractEntity,它由应用程序中的所有实体扩展,基本上充当标识符提供者 @MappedSuperclass public class AbstractEntity implements DomainEntity { private static final long serialVersionUID = 1L; /** This object's id */ @Id @GeneratedValue(strategy = Generatio

我有一个类AbstractEntity,它由应用程序中的所有实体扩展,基本上充当标识符提供者

@MappedSuperclass
public class AbstractEntity implements DomainEntity {

    private static final long serialVersionUID = 1L;

    /** This object's id */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected long id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="creation_date", nullable = false, updatable=false)
    private Date creationDate = new Date();

    /**
     * @return the id
     */
    public long getId() {
        return this.id;
    }

    /**
     * @param id the id to set
     */
    public void setId(long id) {
        this.id = id;
    }
}
我现在有一个例子,我需要为我的两个实体类定义一个单独的Id,因为它们需要一个自定义序列生成器。如何做到这一点

@Entity
@Table(name = "sample_entity")
public class ChildEntity extends AbstractChangeableEntity {

    @Column(name = "batch_priority")
    private int priority;

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

}

你不能这样做,正如你的例子所示

一旦在基类中定义了
@Id
,就无法在子类中重写它,这意味着最好将
@Id
的责任留给每个具体的类。

拆分基类

定义除ID以外的所有公共字段:

@MappedSuperclass
public  abstract class AbstractEntityNoId implements DomainEntity {
 private static final long serialVersionUID = 1L;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="creation_date", nullable = false, updatable=false)
    private Date creationDate = new Date();
}
使用默认ID生成器扩展以上内容:

@MappedSuperclass
public abstract class AbstractEntity extends AbstractEntityNoId {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

    public Long getId(){
       return id;
    }
}
需要自定义ID生成的类扩展了前者,其他类扩展了后者


有了以上内容,除了需要生成自定义ID的实体之外,任何现有代码都不需要更改。

解决方案之一(在某些情况下不可行)是在get方法上使用注释,而不是字段。它将为您提供更大的灵活性,特别是覆盖您想要的任何内容

代码:

@MappedSuperclass
public class AbstractEntity implements DomainEntity {

    private static final long serialVersionUID = 1L;

    protected long id;

    private Date creationDate = new Date();

    /**
     * @return the id
     */
    /** This object's id */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getId() {
        return this.id;
    }

    /**
     * @param id the id to set
     */
    public void setId(long id) {
        this.id = id;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="creation_date", nullable = false, updatable=false)
    public Date getCreationDate () {
        return this.creationDate ;
    }
}
以及您的子类:

@Entity
@Table(name = "sample_entity")
public class ChildEntity extends AbstractChangeableEntity {


private int priority;

@Override
@Id
@GeneratedValue(strategy = GenerationType.ANOTHER_STRATEGY)
public long getId() {
    return this.id;
}

@Column(name = "batch_priority")
public int getPriority() {
        return priority;
    }
public void setPriority(int priority) {
        this.priority = priority;
    }

}

一个选项是覆盖需要自定义的子类中的生成器名称,但这意味着您对所有实体使用相同类型的生成器(序列生成器)。查看更多信息。如果您/我们可以在子类中重写整个生成器,这将是一个理想的选择,但我认为现在它不能工作。但是我想维护层次结构,我只想以某种方式隐藏基类提供的标识符。正如已经指出的,您不能。有了上述功能,除了需要自定义ID生成的实体的超类之外,您不需要更改任何现有代码。一切仍然是DomainEntity的一个实例。