当前位置: 首页 > 知识库问答 >
问题:

用Spring Repo更新OneToOne的列

诸葛绍元
2023-03-14
public class User implements java.io.Serializable, UserDetails  {
@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "person") )
@Id
@GeneratedValue(generator = "generator")

@Column(name = "person_id", unique = true, nullable = false)
public int getPersonId() {
    return this.personId;
}

public void setPersonId(int personId) {
    this.personId = personId;
}

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public Person getPerson() {
    return this.person;
}

public void setPerson(Person person) {
    this.person = person;
}

    @Column(name = "email", unique = true, nullable = false, length = 50)
public String getEmail() {
    return this.email;
}

public void setLoginVersuche(int loginVersuche) {
    this.loginVersuche = loginVersuche;
}

@Column(name ="loginVersuche")
public int getLoginVersuche() {
    return loginVersuche;
}
...omitted code...

}

和人:

public class Person implements java.io.Serializable {

@Id
@GeneratedValue(strategy = IDENTITY)

@Column(name = "idPerson", unique = true, nullable = false)
public Integer getIdPerson() {
    return this.idPerson;
}

public void setIdPerson(Integer idPerson) {
    this.idPerson = idPerson;
}

@OneToOne(fetch = FetchType.LAZY, mappedBy = "person")
public User getUser() {
    return this.user;
}

public void setUser(User user) {
    this.user = user;
}
...omitted code...
}

我有我的刀:

@Repository
public interface UserDAO extends CrudRepository<User, Integer>{
    User findByEmail(String user);
}
User userByDB = userDAO.findByEmail(username);    
userByDB.setLoginVersuche(userByDB.getLoginVersuche()+1);
userDAO.save(userByDB);
@Transactional
    @Modifying
    @Query("update User u set u.loginVersuche = u.loginVersuche+1, u.gesperrt = ?1 where u.email = ?2")
    public int incrementLoginVersuche(boolean gesperrt, String email);
@Bean(name = "transactionManager")
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(dataSource());
    }

共有1个答案

周子平
2023-03-14

根据文档(4.6.交易性)

存储库实例上的CRUD方法默认是事务性的

因此,在UserDAO接口上不需要@transactional(readOnly=true)注释。相反,您应该使您的保存方法成为事务性的(假设您的类是一个有效的Spring组件):

@Transactional
public void incrementVersuche() {
    ...    
    User userByDB = userDAO.findByEmail(username);    
    userByDB.setLoginVersuche(userByDB.getLoginVersuche()+1);
    userDAO.save(userByDB);
}
public interface IUserSaver { 
        void incrementVersucheAndSave(String username)
}

@Service
public class UserSaver implements IUserSaver {

@Transactional
public void incrementVersucheAndSave(String username) {
        User userByDB = userDAO.findByEmail(username);    
        userByDB.setLoginVersuche(userByDB.getLoginVersuche()+1);
        userDAO.save(userByDB);
      }
}
....
@Autowired
private IUserSaver saver;

 public void incrementLoginVersuche() {
   ....
   saver.incrementVersucheAndSave(username);
}
 类似资料:
  • 我们有一个名为的实体,它与实体有OneToOne关系。

  • 我们正在构建一个应用程序,我们需要将实体更新登录到历史表中。我试图通过Hibernate拦截器来实现这一点,我们可以设法获得所有的更改,但很难将它们插入审计表。 我的JPA配置 我的拦截器 } 在方法afterTransactionCompletion中,我需要将所有审计实体写入DB,Autowire不工作,因为这不是spring管理的bean,是否有任何方法可以在此方法中获取DB会话,以便我可以

  • 你好,我在删除实体时遇到了问题。entitymanager不会删除实体。有人看到代码中的错误吗? 错误消息: java.lang.Assertionerror: 预期 :null 实际 :帐户{id=1, 客户=客户 id=1, 名字=“金”, 姓氏=“佩德森”, email='kim@yahoo.no“, 电话号码=”90045870“, 出生=1980-11-05 00:00:00.0}, 登

  • 我正在读《理解SQL Server中的锁定》。但我不太理解更新锁的目的。 详细说明如下: 更新锁 更新(U)锁防止常见形式的死锁。典型的更新模式包括事务读取记录,获取资源(页或行)上的共享(S)锁,然后修改行,这需要锁转换为排他(X)锁。如果两个事务获取资源上的共享模式锁,然后尝试同时更新数据,一个事务尝试锁转换为排他(X)锁。共享模式到排他锁的转换必须等待,因为一个事务的排他锁与另一个事务的共享

  • 我正在制作一个由任务管理器组成的应用程序。 在此任务管理器中,收件箱列表中有3个列表(收件箱、今天和星期),其中仅显示不带类别的任务,而在其他两个列表中,分别显示今天和本周的带类别或不带类别的任务。 我希望能够更改三个列表中一个任务的类别。因此,如果我更改收件箱任务的类别(不应该有类别),整个表都应该更新,任务应该从列表中删除。 我调试了程序,任务被正确地从列表中删除,但只有类别的单元格被更新,而

  • 问题内容: 它是有效申报,并在关系的双方,如: 我找不到任何表明这是无效的信息,但似乎在持久性过程中,至少必须违反关系的一侧。(例如,如果首先写入changeEntry,则changeEntryDetails临时为null)。 尝试此操作时,我看到抛出了异常。 我想避免在可能的情况下放宽约束,因为双方都 必须 存在。 问题答案: 声明并在关系的两边是否合法(…)我找不到任何表明无效的内容,但是在持