Java 我可以将builder设计模式与hibernate一起使用吗?

Java 我可以将builder设计模式与hibernate一起使用吗?,java,hibernate,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 MyEnti

假设我有这门课:

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;}
}

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

生成器是用于创建对象的外部机制。为实体提供一个默认构造函数就足够了,hibernate不会在意如何获得它。所以是-这是可能的,就像普通实体一样。

是和否。如果您还提供setter,您可以使用它

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

但是,如果您只想使用BuilderAPI作为一个流畅的接口来生成对象,同时保持对象的getter和setter不变,那么这当然没有什么坏处(除了代码的重复)


顺便说一句:Fluent setter不是有效的javabean setter。该机制不理解它们。setter必须有一个void返回类型。

是这样吗?我认为,如果选择属性访问(将@Column放在属性上,而不是放在访问方法上),那么在hibernate中就可以不用设置器了?或者让他们私下胡说八道。。那么模式中的内部构建器类呢。这是Hibernate的问题吗?@bert小心你的措辞:你描述的是字段访问,而不是属性访问。在Java中,属性由其getter和/或setter方法定义,而不是由底层字段定义。在注释字段时,它可能会起作用,但如果字段被标记为最终字段,则不会起作用(这对于使用生成器创建的对象来说是一种良好的做法)。不,内部类不是问题,只要它是静态的并且没有标记为@Entity.Thank。你当然是对的。我指的是财产准入。我的用例是映射字段为'updateable=false',我希望在api中强制实现这一点。