0

我对 JPA 注释 POJO 类中的 getter 和 setter 如何通过 Hibernate 与建议的 MySQL 数据库交互感到有些困惑。

我了解您可以拥有例如以下内容:

@Entity
@Table(appliesTo = "users")
public class UserDM implements UserIF, Serializable {

  private static final long serialVersionUID = 1L;
  private long              id;
  private String            name;
  private Date              createDate;

  @Id  
  @Column(name="id")  
  @GeneratedValue(strategy=GenerationType.AUTO)
  public long getId() {
      return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(final String n) {
    name = n;
  }

  public Date getCreateDate() {
    return createDate;
  }

  public void setCreateDate(final long time) {
    createDate = new Date(time);
  }
}
  • 为什么自动 ID 生成策略Getter相关联?

  • 当存储新用户时,该方法实际上如何自动增加 ID ?

  • 操作顺序是什么?POJO是通过setter(或者可能是构造函数?)填充的,然后hibernate通过getter获取信息,然后存储到db中?

  • 让我的“getCreateDate”方法返回一个日期是个好主意,还是最好让 pojos 中的字段映射到 MySQL 友好的字段?如果我想从时间戳 ms 值中获取 Date 对象,那么最好的方法是使用瞬态映射函数吗?

4

1 回答 1

3

为什么自动 ID 生成策略与 Getter 相关联?

大多数时候,这是一个品味问题。您可以将注释放在字段或访问器(getter)上,这取决于您喜欢的方式,只要它是一致的(总是在方法上,或总是在属性上)。通过将其设置为属性,Hibernate 将使用反射来访问该属性(它并不像听起来那么糟糕)。通过将其设置为方法,Hibernate 将使用它而不是反射。

当存储新用户时,该方法实际上如何自动增加 ID?

不确定您想要答案的详细程度,但要简短:
Auto 将为您正在使用的数据库服务器使用最佳的自动增量策略。它可能是 Sybase/SQLServer 的“身份”,它可能是 Oracle 的“序列”,或者它可能是 MySQL 的“自动增量”。所有这些情况的共同点是,在数据库生成 ID 之前,Hibernate 不会知道 ID。触发“插入”后,Hibernate 将使用标准 JDBC 方法访问“生成的 id”

操作顺序是什么?POJO是通过setter(或者可能是构造函数?)填充的,然后hibernate通过getter获取信息,然后存储到db中?

同样,我不知道您想要哪个级别的详细信息,但是是的,这就是顺序。您填充 POJO 并调用 EntityManager 上的 persist 方法,将此 POJO 作为参数传递。然后 Hibernate 将调用 getter(或访问属性)并将此数据发送到数据库。

让我的“getCreateDate”方法返回一个日期是个好主意,还是最好让 pojos 中的字段映射到 MySQL 友好的字段?如果我想从时间戳 ms 值中获取 Date 对象,那么最好的方法是使用瞬态映射函数吗?

Try to keep your application "database agnostic". So, don't make it "mysql friendly" if you don't really need. In general, using a java.util.Date in a field mapped with @Temporal(TIMESTAMP) would do, but if you need more "powerful" date/time objects, like Joda-time, you can also use it (as long as you tell Hibernate how to use it).

于 2012-06-25T06:45:13.280 回答