java Hibernate使用数据类实体的子类

tzxcd3kk  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(148)

我有这样一个实体:

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Entity
public class EBase {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "e_id", nullable = false)
  private Integer id;

  @Column(name = "name")
  protected String name;

  @Column(name = "letters")
  protected byte letters;
}

为了修改数据,我使用了另一个类:

@NoArgsConstructor
@AllArgsConstructor
public class E extends EBase {
  public void setName(String name) {
    super.name = name;
    super.letters = (byte) name.length();
  }
}

我知道这个问题可以用不同的方法来解决,我也不会像这样存储字符串的长度,但是把我的问题形象化是很好的,我想有一个只有Getter和Setter的实体,没有"真正的"其他方法,现在让我们创建一个实体:

public class Main {
  public static void main(String[] args) {
    final E e = new E();
    e.setName("Test");
    Database.getSession().save(e);
  }
}

我的问题是:这可能吗?
我试过工厂课程

@RequiredArgsConstructor
@Getter
class EFactory {
  private final EBase e;
  public void setName(String name) {
    e.setName(name);
    e.setLetters((byte) name.length());  // setters in EBase implemented
  }

  public EBase get() {
    return e;
  }
  
}

与:

public class Main {
  public static void main(String[] args) {
    EBase e = new EBase();
    e = new EFactory(e).setName("Test").get();
    Database.getSession().save(e);
  }
}

但这并不是很花哨,即使E不是实体,上面提到的解决方案也是可能的吗?

vlju58qv

vlju58qv1#

builder模式用于创建不可变的对象,例如:

public class EBase {
    private final Integer id;
    private final String name;
    private final byte letters;

    private EBase(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.letters = builder.letters;
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public byte getLetters() {
        return letters;
    }

    protected static class Builder {
        private Integer id;
        private String name;
        private byte letters;

        public Builder setId(Integer id) {
            this.id = id;
            return this;
        }

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setLetters(byte letters) {
            this.letters = letters;
            return this;
        }

        public EBase build() {
            return new EBase(this);
        }
    }
}

现在,如果您使用的是hib,您希望将对象存储在SQL数据库中,并且,如果您可以存储对象而无需修改它们,那么大多数情况下,您将希望能够修改它们。
当然,你可以把所有二传手移到另一个类中,就像这样:

public class EBase {
    private Integer id;
    private String name;
    private byte letters;

    public interface Updater {
        public Updater setId(Integer id);
        public Updater setName(String name);
        public Updater setLetters(byte letters);
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public byte getLetters() {
        return letters;
    }

    public Updater getUpdater() {
        return new Updater() {
            @Override
            public Updater setId(Integer newId) {
                id = newId;
                return this;
            }

            @Override
            public Updater setName(String newName) {
                name = newName;
                return this;
            }

            @Override
            public Updater setLetters(byte newLetters) {
                letters = newLetters;
                return this;
            }
        };
    }
}

但我不明白你为什么要继承遗产。
也就是说,我建议您不要使用这两种模式,而只是在同一个类中声明getter和setter。

相关问题