数据库如何通过 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 一起使用来创建模式