当我 select MySQL 中的一行使用休眠 类 时,它会自动进行更新

When I select a row in MySQL using hibernate classes, it makes an update automatically

我正在尝试为我的用户开发一个包含多个变量的黑名单。因此,当用户在我的应用程序中注册时,我会检查某些参数是否被列入黑名单。

问题是,当我执行 select 并且数据库找到适合我的搜索的内容时,它会自动执行更新以清除该行。

这是 MySQL 日志:

   86 Query select * from blacklist where mobile_token = 'b'
       86 Query SHOW WARNINGS
       86 Query select @@session.tx_read_only
       86 Query update mydatabase.blacklist set email=null, iban=null, mobile_token=null, nif=null where blacklist_id=1
       86 Query SHOW WARNINGS
       86 Query commit
       86 Query SET autocommit=1
       86 Query SET autocommit=1
       86 Query set session transaction read write

这是我的table:

我的模特:

package models.classes_hibernate;

import javax.persistence.*;

import static javax.persistence.GenerationType.IDENTITY;

@Entity
@Table(name="blacklist"
    ,catalog="mydatabase"
)
public class Blacklist implements java.io.Serializable {

    private Integer blacklistId;
    private String mobileToken;
    private String iban;
    private String nif;
    private String email;

    public Blacklist() {
    }

    @Id @GeneratedValue(strategy=IDENTITY)

    @Column(name="blacklist_id", unique=true, nullable=false)
    public Integer getBlacklistId() {
        return this.blacklistId;
    }
    public void setBlacklistId(Integer blacklistId) {
        this.blacklistId = blacklistId;
    }

    @Column(name="mobile_token", nullable = false)
    public String getMobileToken() {
        return this.mobileToken;
    }
    public void setMobileToken(String name) {
        this.mobileToken = mobileToken;
    }

    @Column(name="iban", nullable = false)
    public String getIban() {
        return this.iban;
    }
    public void setIban(String name) {
        this.iban = iban;
    }

    @Column(name="nif", nullable = false)
    public String getNif() {
        return this.nif;
    }
    public void setNif(String name) {
        this.nif =  nif;
    }

    @Column(name="email", nullable = false)
    public String getEmail() {
        return this.email;
    }
    public void setEmail(String name) {
        this.email =  email;
    }
}

还有我的 DAO:

package models.dao;

import com.google.common.collect.Lists;
import models.classes_hibernate.Blacklist;
import models.pages.Page;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.type.StringType;
import play.Logger;
import play.db.jpa.JPA;
import play.db.jpa.Transactional;

import javax.persistence.NoResultException;
import javax.persistence.Query;
import java.util.List;

public class BlacklistDAOImpl implements MyAppCRUDDAOInterface<Blacklist> {

    @Override
    public void create(Blacklist entity) {
        JPA.em().persist(entity);
    }

    @Override
    public Blacklist read(Integer id) {
        return JPA.em().find(Blacklist.class, id);
    }

    public Page<Blacklist> readAll(String orientation,int pageSize, int beginElementId)
    {
        Query query = null;
        List<Blacklist> blacklists = null;
        boolean areThereMore = false;
        Page<Blacklist> allBlacklists = null;
        int size = 0;

        if(orientation.equals("all")) {
            query = JPA.em().createNativeQuery("select * from blacklist",Blacklist.class);

        }

        if(orientation.equals("lt")) {
            query = JPA.em().createNativeQuery("select * from blacklist where blacklist_id < ? ORDER BY blacklist_id DESC",Blacklist.class);
            query.setParameter(1, beginElementId);
            size =query.getResultList().size();
            query.setMaxResults(pageSize);
        }

        if(orientation.equals("gt")) {
            query = JPA.em().createNativeQuery("select * from blacklist blacklist_id > ? ORDER BY blacklist_id ASC",Blacklist.class);
            query.setParameter(1, beginElementId);
            size =query.getResultList().size();
            query.setMaxResults(pageSize);

        }

        if (size>pageSize)
            areThereMore = true;

        try {
            blacklists = query.getResultList();

            if (orientation.equals("gt")) {
                List<Blacklist> reverseList = Lists.reverse(blacklists);
                blacklists = reverseList;
            }
            allBlacklists = new Page<Blacklist>(blacklists, areThereMore, "Blacklist");

            return allBlacklists;
        }
        catch(NoResultException nre){
            allBlacklists=null;
            return allBlacklists;
        }
    }

    @Override
    public void update(Blacklist entity) {
        JPA.em().merge(entity);
    }

    @Override
    public void delete(Blacklist entity) {
        JPA.em().remove(entity);
    }

    @Override
    public boolean isManaged(Blacklist entity) {
        return JPA.em().contains(entity);
    }

    @Override
    public void close() {
        JPA.em().close();
    }

    public Boolean isMobileTokenBlacklisted(String mobileToken) {

        Query query = JPA.em().createNativeQuery("select * from blacklist where mobile_token = ?",Blacklist.class);
        query.setParameter(1, mobileToken);

        Blacklist blacklist;
        try {
            Logger.debug("Voy a comprobar");
            blacklist = (Blacklist)query.getSingleResult();
        } catch (NoResultException nre){
            blacklist=null;
        }
        return blacklist != null;
    }

isMobileTokenBlacklisted 调用:

@POST
@Path("/api/user")
@ApiOperation(position = 3, nickname ="user", value = "Sign up new user",notes = "Minimum JSON required: ",
        response = AppUserJSON.class, httpMethod = "POST")
@BodyParser.Of(BodyParser.Json.class)
@Transactional
public static Result signup() {

    AppUserDAOImpl appUserDAO = new AppUserDAOImpl();

    AppUserJSON user = null;
    AppUser appUser = null;
    BlacklistDAOImpl blacklistDAO = new BlacklistDAOImpl();
    try {
        user = parse();

        String encrypt_nif = user.nif;
        String encrypt_authorization = user.parental_authorization;
        String encrypt_password = user.password;
        try {
            encrypt_password= EncryptUtils.encrypt(config1.getString("key"),user.password);
            if(user.nif!= null)
                encrypt_nif = EncryptUtils.encrypt(config1.getString("key"),user.nif);
            if(user.parental_authorization!= null)
                encrypt_authorization = EncryptUtils.encrypt(config1.getString("key"),user.parental_authorization);
        } catch (Exception e) {
            e.printStackTrace();
        }
        appUser = new AppUser(new Date(), new Date(),user.email.toLowerCase(), encrypt_password, user.mobile_token,
                user.mobile_device, 0, 0, 0, 0, encrypt_nif,
                false,"NOT_LOCKED", encrypt_authorization, 0, false);

        if (user.email == null) {
            return status (200, "email missing");
        } else if (blacklistDAO.isEmailBlacklisted(user.email)){
            return status(401, "Email is blacklisted");
        }

        if (user.password == null)
            return status(201, "password missing");

        if (user.mobile_token == null) {
            return status (206, "mobileToken missing");
        } else if (blacklistDAO.isMobileTokenBlacklisted(user.mobile_token)){
            Logger.debug("MobileToken blacklisted");
            return status(401, "Mobile token is blacklisted");
        }

        if (user.mobile_device== null)
            return status(207, "mobileDevice missing");

        else{
            appUserDAO.create(appUser);
            user.app_user_id= appUser.getAppUserId();
            return ok(Json.toJson(user));
        }

    } catch (IncompleteJSONException e) {
        return badRequest("IncompleteJSONException");
    } catch (DuplicateJSONException e) {
        return badRequest("DuplicateJSONException");
    }
}

谢谢!

我不知道它是从哪里来的,但我们可以找到一种方法来纠正某些问题以改进您的代码并排除某些查询。

  • 请务必在您的 if 周围使用方括号。这不是强制性的,但可以使代码更清晰
  • 注册方法中else不逻辑。它只取决于最后一个if(mobiledevice test)。如果所有测试都是错误的,您可能想要创建您的用户。
  • 在这里你只是想测试一下你是否有与你的研究相对应的黑名单元素。您可以使用 COUNT 函数,甚至可以使用 EXISTS,这可能会更有效。

您也可以使用调试模式查看更新完成的位置。