【发布时间】:2015-09-06 12:49:35
【问题描述】:
我使用 JpaRepository 保存数据,但是 hibernate.show_sql 显示“选择”并且不会保存数据。以下是我的服务:
@Autowired
private UserRepository userRepository;
@PostConstruct
public void init() {
User admin = new User();
admin.setDisplayName("admin");
admin.setEmailAddress("admin@admin");
admin.setPassword("admin___");
admin.setRegisteredAt(new Date());
admin.setLastAccessAt(new Date());
admin.setUuid(UUID.randomUUID().toString());
try {
System.out.println("before save");
userRepository.save(admin);
System.out.println("after save");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
输出如下:
========保存前======
休眠:选择 user0_.uuid 作为 uuid1_0_0_,user0_.display_name 作为 display_2_0_0_,user0_.email_address 作为 email_ad3_0_0_,user0_.last_access_at 作为 last_acc4_0_0_,user0_.password 作为 password5_0_0_,user0_.registered_at 作为 register6_0_0_ from User user0_ where user0_.u
========保存后=======
以下是我的applicationContext.xml:
<context:component-scan base-package="test">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/helloworld" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
<bean id="myEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="test.entity"></property>
<property name="dataSource" ref="myDataSource" />
<property name="jpaProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="persistenceProvider">
<bean class="org.hibernate.jpa.HibernatePersistenceProvider"></bean>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource" />
</bean>
<jpa:repositories base-package="test.repository"
entity-manager-factory-ref="myEmf" transaction-manager-ref="transactionManager"></jpa:repositories>
附件是我的 JPA 工具生成的类:
@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String uuid;
@Column(name="display_name")
private String displayName;
@Column(name="email_address")
private String emailAddress;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="last_access_at")
private Date lastAccessAt;
private String password;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="registered_at")
private Date registeredAt;
public User() {
}
public String getUuid() {
return this.uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getDisplayName() {
return this.displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getEmailAddress() {
return this.emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public Date getLastAccessAt() {
return this.lastAccessAt;
}
public void setLastAccessAt(Date lastAccessAt) {
this.lastAccessAt = lastAccessAt;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getRegisteredAt() {
return this.registeredAt;
}
public void setRegisteredAt(Date registeredAt) {
this.registeredAt = registeredAt;
}
}
【问题讨论】:
-
你确定你正在执行你发布的代码吗?为什么保存新用户会发出选择查询?此外,由于您使用的是 JPA,因此事务管理器应该是 JpaTransactionManager。
-
你太棒了!更改为 JpaTransactionManager 后,它现在就像一个魅力。
-
它显示先选择,然后插入。这是正常的吗? ========保存前======休眠:选择user0_.uuid作为uuid1_0_0_,user0_.display_name作为display_2_0_0_,user0_.email_address作为email_ad3_0_0_,user0_.last_access_at作为last_acc4_0_0_,user0_.password作为password5_0_0_,user0_ .registered_at as register6_0_0_ from User user0_ where user0_.uuid=? Hibernate:插入用户(display_name,email_address,last_access_at,password,registered_at,uuid)值(?,?,?,?,?,?)========保存后=======
-
我的猜测是,这是由于您自己分配 ID 而不是让 Hibernate 来分配 ID,并且您没有任何 @Version 注释字段,并且您使用 merge() 而不是 persist ()。因此,Hibernate 无法知道实体是否已经存在并且应该更新,或者它是否还不存在并且应该插入。
-
我刚刚附上了我的课。我使用 uuid 作为主键。如果我使用 GeneratedValue,则运行时会出错。我想知道如何添加@Version 和 persis()。谢谢。