2017-02-18 55 views
1

具有2实体类为两个不同的数据库表,Table1.java具有IDS手动生成和Table2.java已经序列生成的ID,是否可以移动id属性,所述@Id@Column注释和getters & setter for id到GenericTable的超类,并且留下@GeneratedValue@SequenceGenerator里面的子类只需要它们?该解决方案必须可扩展为这两种类型的数百个表,并且不应将GenericTable超类分为两类。休眠重构@Id字段进行超

的问题是,@GeneratedValue作品只在现场/方法的水平,因此必须将其移至作出强制实施@SequenceGeneratorTable1.java特性冲突的所有子类的父类。

@Entity 
@Table(name = "TABLE1") 
public class Table1 extends GenericTable { 

    @Id 
    @Column(name = "ID", nullable = false, precision = 22, scale = 0) 
    private Long id; 

    // other properties 
    // getters & setters for id 
    // other getters & setters 
} 

@Entity 
@Table(name = "TABLE2") 
public class Table2 extends GenericTable { 

    @Id 
    @GeneratedValue(strategy = SEQUENCE, generator = "generator") 
    @SequenceGenerator(name = "generator", sequenceName = "TABLE2_SEQ", allocationSize = 1) 
    @Column(name = "ID", nullable = false, precision = 22, scale = 0) 
    private Long id; 

    // other properties 
    // getters & setters for id 
    // other getters & setters 
} 

@MappedSuperclass 
public abstract class GenericTable { 

} 

回答

1

我不认为它可能在一个类中填充这两种配置类型。

我做了一些测试,并有两个@MappedSuperclass实体,你应该能够实现满足您的可重复使用的/可扩展性需求的解决方案:

基本ID类型父

@MappedSuperclass 
public abstract class BasicIdAwareEntity implements Serializable { 

    protected Long id; 

    @Id 
    @Column(name = "ID", nullable = false, precision = 22, scale = 0) 
    public Long getId() { 
     return id; 
    } 

序列标识变化亲本

@MappedSuperclass 
public abstract class SequenceIdAwareEntity extends BasicIdAwareEntity { 

    @Override 
    @Id 
    @GeneratedValue(strategy = SEQUENCE, generator = "generator") 
    @SequenceGenerator(name = "generator", sequenceName = "TABLE2_SEQ", allocationSize = 1) 
    public Long getId() { 
    return super.getId(); 
    } 

具体的实体

@Entity 
@Table(name = "TABLE1") 
public class Table1 extends BasicIdAwareEntity { 

@Entity 
@Table(name = "TABLE2") 
public class Table2 extends SequenceIdAwareEntity { 

现在,如果你需要在未来某个时间点重构这个映射,比如你需要更改ID列的精度,那么你只需在BasicIdAwareEntity课程中进行更改即可。类型改变也是如此,在良好的IDE帮助下,也应该改变子类。

您需要将所有抽象类放入的唯一注解是@Id。

如果您将来需要为某个表具有不同的生成器,那么您只需创建另一个BasicIdAwareEntity的子类。

+0

我还有两个问题要问你:1.如果你有更多的表格,比如Table2,但序列名称不同,你会如何改变你的例子。 2.如果您需要更多超类(如Dictionary)(具有标签和状态属性),可审计(具有更多列)等等,您将最终为每个序列感知和非序列感知基本类型复制每个抽象类型。你会如何重构这种情况? – pXel