我可以将构建器设计模式与hibernate一起使用吗?

Yos*_*ssi 9 java hibernate

假设我有这门课:

public class MyEntity {
  private int id;
  private String name;
  private MyEntity(int id, String name) {this.id= id; this.name = name;}
  public static class MyEntityBuilder {
    private int id;
    private String name;
    private MyEntityBuilder setId(int id) {this.id = id;}
    private MyEntityBuilder setName(String name) {this.name = name;}
    private MyEntity build() {return new MyEntity(id,name);} 
  }
  private int getId() {return id;}
  private String getName() {return name;}
}
Run Code Online (Sandbox Code Playgroud)

我可以使用hibernate注释将其映射到表吗?

Sea*_*oyd 5

是的,不是.如果您还提供制定者,则可以使用它.

Hibernate使用Java Bean来访问属性,因此它依赖于getXXX()setXXX()存在的方法.构建器模式的整个要点(至少根据Joshua Bloch)是创建不带setter的不可变对象.这不适用于Hibernate(或任何ORM),因为它们使用setter来注入值.

但是,如果您只是想使用构建器API作为流畅的界面来生成对象,同时保持其getter和setter完整,那么当然没有任何害处(除了它是代码的重复).

BTW:Fluent setter不是有效的Java Beans setter.该Introspector机制不理解他们.Setter必须具有void返回类型.


Boz*_*zho 4

构建器是创建对象的外部机制。您为实体提供默认构造函数就足够了,hibernate 不会关心您如何获取它。所以是的 - 这是可能的,就像一个正常的实体一样。