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

Posted

技术标签:

【中文标题】数据库如何通过 Hibernate 与 jpa 注释的 pojo 类交互?【英文标题】:How do databases interact with jpa annotated pojo classes via Hibernate? 【发布时间】:2012-06-25 05:03:30 【问题描述】:

我对 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 对象,最好的方法是使用瞬态映射函数吗?

【问题讨论】:

jpa-primary-key-auto-generate 将帮助您更好地理解。 @GeneratedValue(strategy=GenerationType.AUTO) 工作正常吗? 我还没有实现。我正在创建健壮的 Spring3 应用程序并从下往上开始。我仍在弄清楚这一切是如何运作的,还没有真正“尝试任何事情”,我目前正在连续获得我的鸭子 抱歉重复发布,但要澄清一下 - 我想知道 Hibernate 在看到 @column 注释时会做什么(在字段或方法上)。谢谢! Hibernate 将 java 变量与表列绑定。 【参考方案1】:

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

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

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

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

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

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

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

尽量让您的应用程序“与数据库无关”。所以,如果你真的不需要,不要让它“对mysql友好”。一般来说,在使用@Temporal(TIMESTAMP) 映射的字段中使用 java.util.Date 就可以了,但是如果您需要更“强大”的日期/时间对象,例如 Joda-time,您也可以使用它(只要你告诉 Hibernate 如何使用它)。

【讨论】:

以上是关于数据库如何通过 Hibernate 与 jpa 注释的 pojo 类交互?的主要内容,如果未能解决你的问题,请参考以下文章

如果不存在,则通过将 spring Jpa 与 hibernate 一起使用来创建模式

JPA与hibernate-------JPA

JPA与hibernate-------JPA

如何将继承策略与 JPA 注释和 Hibernate 混合使用?

JPA与Hibernate的关系

01-hibernate注解:类级别注解准备工作