数据库如何通过Hibernate与jpa注释的pojo类进行交互?

时间:2012-06-25 05:03:31

标签: java mysql hibernate jpa jpa-2.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(或者是构造函数?)填充的,然后通过getter从hibernate获取信息然后存储到db中?

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

1 个答案:

答案 0 :(得分:3)

  

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

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

  

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

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

  

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

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

  

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

尽量保持您的应用程序“数据库不可知”。所以,如果你真的不需要,不要让它“友好的mysql”。通常,在使用@Temporal(TIMESTAMP)映射的字段中使用java.util.Date可以,但如果您需要更多“强大的”日期/时间对象,例如 Joda-time ,则可以也使用它(只要告诉Hibernate如何使用它)。