Ant*_*nio 6 java spring spring-data-jpa spring-boot
我的userDB表看起来像这样:
CREATE TABLE user (
username VARCHAR(32) PRIMARY KEY,
first_name VARCHAR(256) NOT NULL,
last_name VARCHAR(256) NOT NULL,
password VARCHAR(32) NOT NULL,
enabled BOOL
) ENGINE = InnoDB;
Run Code Online (Sandbox Code Playgroud)
这是我的实体的字段定义:
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
@Column(nullable = false)
private String password;
Run Code Online (Sandbox Code Playgroud)
该字段username是我的表/实体的关键,我可以设置它的值.当我需要创建另一个用户时,我在我的服务中执行此操作:
public User insertUserImpl(String username, String firstName, String lastName) {
Assert.hasText(username);
Assert.hasText(firstName);
Assert.hasText(lastName);
String password = UUID.randomUUID().toString().substring(0, 4); // temp
User user = new User(username, password);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setEnabled(false);
this.userRepository.save(user);
// FIXME - assegnare un ruolo
return user;
}
Run Code Online (Sandbox Code Playgroud)
无论如何,如果已经使用了用户名,则存储库只进行更新,因为指定的标识符不为空.这不是我想要的行为,我需要它抛出类似重复的条目异常.有什么方法可以预防吗?我必须自己做吗?例如:
User user = this.userRepository.findOne(username);
if(user != null) {
throw new RuntimeException("Username already taken"); // FIXME - eccezione applicativa
}
Run Code Online (Sandbox Code Playgroud)
sal*_*ama 16
当使用默认配置时,使用CrudRepository#save()或JpaRepository#save()它将委托给它EntityManager使用persists()它是否是新实体,或者merge()如果不是.
当使用默认配置时,遵循以下策略来检测实体状态,无论是否为新,使用适当的方法如下:
null,则它是新实体,否则不是.Persistable检测,则将委托给实体实现的isNew()方法.EntityInformation,但需要进一步的自定义.因此,在您的情况下,当您使用用户名为ID,并且它不为空时,存储库调用最终委托给EntityManager.merge()而不是persist().所以有两种可能的解决方案:
ID属性,将其设置为null,并使用任何自动生成方法,或Persistable并使用该isNew()方法,以确定它是否是新实体.如果由于某种原因,您不想修改实体,还可以更改修改刷新模式配置的行为.默认情况下,在spring数据jpa中,hibernate flush模式设置为AUTO.你想要做的是将其更改为COMMIT,并将属性更改为org.hibernate.flushMode.您可以通过替换修改这个配置EntityManagerFactoryBean在一个@Configuration班.
如果您不想弄乱EntityManager的配置,可以使用JpaRepository#flush()或JpaRepository#saveAndFlush()方法将挂起的更改提交到数据库.
| 归档时间: |
|
| 查看次数: |
11160 次 |
| 最近记录: |