【问题标题】:When I select a row in MySQL using hibernate classes, it makes an update automatically当我使用休眠类在 MySQL 中选择一行时,它会自动进行更新
【发布时间】:2015-06-04 06:44:48
【问题描述】:

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

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

这是 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

这是我的桌子:

我的模特:

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");
    }
}

谢谢!

【问题讨论】:

  • 我看不到你的isMobileTokenBlacklisted方法在哪里被调用?而且我不明白为什么您的更新查询是在 fairtime.blacklist 上完成的,而您的目录是 mydatabase
  • 我已经编辑了数据库名称,这不是问题。我用 isMobileTokenBlacklisted 调用编辑了问题,两个数据库名称相同。

标签: java mysql hibernate playframework playframework-2.2


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我不知道为什么,但使用 count 而不是 select,它会运行!
猜你喜欢
  • 2012-06-15
  • 2012-10-17
  • 1970-01-01
  • 2015-08-24
  • 2013-03-08
  • 2013-04-24
  • 2012-08-07
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多