Java 为什么在 MySQL 中使用“select”语句后,hibernate 总是调用“update”语句?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18204127/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 23:16:50  来源:igfitidea点击:

Why hibernate always call "update" statement after using "select" statement in MySQL?

javasqldatabasehibernatejpa

提问by user1525949

Is there anybody help me in this case. I am using hibernate for select data from db, but when I check from sql debug log. I always see the update sql printed after I use "select" sql to get data from DB.

在这种情况下有没有人帮助我。我正在使用 hibernate 从数据库中选择数据,但是当我从 sql 调试日志中检查时。在使用“select”sql从数据库获取数据后,我总是看到打印的更新sql。

2013-08-13 13:39:08,054 DEBUG [http-0.0.0.0-8080-1-TASK]-[org.hibernate.SQL]
SELECT this_.id                                            AS id504_2_,
    this_.bridgedlinedialoguri                          AS bridgedL2_504_2_,
    this_.bridgedlineuri                                AS bridgedL3_504_2_,
    this_.currentsipsubscriberprofile                   AS currentS4_504_2_,
    this_.currentsipsubscriberprofiletype               AS currentS5_504_2_,
    this_.messageeventuri                               AS messageE6_504_2_,
    this_.nemobjectid                                   AS neMobjec7_504_2_,
    this_.objectid                                      AS objectId504_2_,
    this_.objecttype                                    AS objectType504_2_,
    this_.sipbridgedlineurienable                       AS sipBrid10_504_2_,
    this_.sipdirectconnecturi                           AS sipDire11_504_2_,
    this_.sipdirectconnecturienable                     AS sipDire12_504_2_,
    this_.sipidentityaddress                            AS sipIden13_504_2_,
    this_.sipidentitycontacturi                         AS sipIden14_504_2_,
    this_.sipidentitypassword                           AS sipIden15_504_2_,
    this_.sipidentityrealm                              AS sipIden16_504_2_,
    this_.sipiotparametersenablestatus                  AS sipIotP17_504_2_,
    this_.sipiotparametersprivacy                       AS sipIotP18_504_2_,
    this_.sipiotparametersrequire100rel                 AS sipIotP19_504_2_,
    this_.sipiotparameterssupport100rel                 AS sipIotP20_504_2_,
    this_.sipmessageeventurienable                      AS sipMess21_504_2_,
    this_.sippreferredid                                AS sipPref22_504_2_,
    this_.sippreferredidmode                            AS sipPref23_504_2_,
    this_.sipsubscribertemplateenable                   AS sipSubs24_504_2_,
    this_.sipusername                                   AS sipUser25_504_2_,
    this_.versipsubscriberprofile_id                    AS verSipS26_504_2_,
    versioneds2_.id                                     AS id507_0_,
    versioneds2_.configurationprofileid                 AS configur4_507_0_,
    versioneds2_.description                            AS descript2_507_0_,
    versioneds2_.version                                AS version507_0_,
    configurat3_.id                                     AS id505_1_,
    configurat3_.description                            AS descript2_505_1_,
    configurat3_.NAME                                   AS name505_1_,
    configurat3_.type                                   AS type505_1_,
    profilemob4_.versionedsipsubscriberconfigprofile_id AS Versione1_507_4_,
    profilemob4_.element                                AS element4_
FROM   test this_
    LEFT OUTER JOIN versionedsipsubscriberconfigprofile versioneds2_
                    ON this_.versipsubscriberprofile_id = versioneds2_.id
    LEFT OUTER JOIN configurationprofile configurat3_
                    ON versioneds2_.configurationprofileid = configurat3_.id
    LEFT OUTER JOIN versionedsipsubscriberconfigprofile_profilemobjectids
                    profilemob4_
                    ON versioneds2_.id =
                    profilemob4_.versionedsipsubscriberconfigprofile_id
WHERE  this_.objectid = ?  

2013-08-13 13:39:08,103 DEBUG [http-0.0.0.0-8080-1-TASK]-[org.hibernate.SQL] 
UPDATE test
SET    bridgedlinedialoguri = ?,
    bridgedlineuri = ?,
    currentsipsubscriberprofile = ?,
    currentsipsubscriberprofiletype = ?,
    messageeventuri = ?,
    nemobjectid = ?,
    objectid = ?,
    objecttype = ?,
    sipbridgedlineurienable = ?,
    sipdirectconnecturi = ?,
    sipdirectconnecturienable = ?,
    sipidentityaddress = ?,
    sipidentitycontacturi = ?,
    sipidentitypassword = ?,
    sipidentityrealm = ?,
    sipiotparametersenablestatus = ?,
    sipiotparametersprivacy = ?,
    sipiotparametersrequire100rel = ?,
    sipiotparameterssupport100rel = ?,
    sipmessageeventurienable = ?,
    sippreferredid = ?,
    sippreferredidmode = ?,
    sipsubscribertemplateenable = ?,
    sipusername = ?,
    versipsubscriberprofile_id = ?
WHERE  id = ?  

Thanks

谢谢

Edit: Code for getting the data:

编辑:获取数据的代码:

 @Override public MObjectId findResult(final MObjectId id, boolean isLocked)
 { 
    Criteria c = getSession().createCriteria(Test.class); 
    c.add(Expression.eq("objectId", id)); 
    if(isLocked)
    { 
      c.setLockMode("this", LockMode.UPGRADE); 
    } 
    Test extension = (Test) c.uniqueResult(); 
    return (extension != null)
      ? new MObjectId("/ontPotsSipExtNr=" + extension.getId()) 
      : null; 
 } 

And entity class as below:

和实体类如下:

@Entity
public class OntPotsSipExtension implements Serializable {

private static final long serialVersionUID = 1L;


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

public OntPotsSipExtension() {

}

@Column(unique = true, nullable = false)
@Type(type = "com.container.persistence.MObjectIdUserType")
private MObjectId objectId;

@Column(unique = false, nullable = true)
@Type(type = "com.container.persistence.MObjectTypeUserType")
private MObjectType objectType;

private ToggleSwitch sipSubscriberTemplateEnable = ToggleSwitch.DISABLE;

@ManyToOne
private VersionedSipSubscriberConfigProfile verSipSubscriberProfile = null;

@Column(unique = false, nullable = true)
@Type(type = "com.container.persistence.MObjectIdUserType")
private MObjectId neMobjectId;
private String sipIdentityAddress;
private String sipIdentityRealm;
private Password sipIdentityPassword;
private String sipIdentityContactURI;

private String sipUsername;

private ToggleSwitch sipDirectConnectUriEnable = ToggleSwitch.DISABLE;
@EnabledExpression("sipDirectConnectUriEnable eq 'ENABLE'")
private String sipDirectConnectUri;

private ToggleSwitch sipMessageEventUriEnable = ToggleSwitch.DISABLE;
@EnabledExpression("sipMessageEventUriEnable eq 'ENABLE'")
private String messageEventUri;

private ToggleSwitch sipBridgedLineUriEnable = ToggleSwitch.DISABLE;
@EnabledExpression("sipBridgedLineUriEnable eq 'ENABLE'")
private String bridgedLineUri;
@EnabledExpression("sipBridgedLineUriEnable eq 'ENABLE'")
private String bridgedLineDialogUri;

@Column(unique = false, nullable = true)
@Type(type = "com.container.persistence.MObjectIdUserType")
private MObjectId currentSipSubscriberProfile;
@Column(unique = false, nullable = true)
@Type(type = "com.container.persistence.MObjectTypeUserType")
private MObjectType currentSipSubscriberProfileType;
/* SIP IOT Parameters*/
private PrivacySettings sipIotParametersPrivacy = PrivacySettings.NULL;
private ToggleSwitch sipIotParametersEnableStatus = ToggleSwitch.ENABLE;
private ToggleSwitch sipPreferredIDMode = ToggleSwitch.DISABLE;
private String sipPreferredID;
private ToggleSwitch sipIotParametersSupport100Rel = ToggleSwitch.DISABLE ;
private ToggleSwitch sipIotParametersRequire100Rel = ToggleSwitch.DISABLE;

public String getBridgedLineDialogUri() {
return bridgedLineDialogUri;
}
public void setBridgedLineDialogUri(String bridgedLineDialogUri) {
this.bridgedLineDialogUri = bridgedLineDialogUri;
}
public String getBridgedLineUri() {
return bridgedLineUri;
}
public void setBridgedLineUri(String bridgedLineUri) {
this.bridgedLineUri = bridgedLineUri;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getMessageEventUri() {
return messageEventUri;
}
public void setMessageEventUri(String messageEventUri) {
this.messageEventUri = messageEventUri;
}
public MObjectId getObjectId() {
return objectId;
}
public void setObjectId(MObjectId objectId) {
this.objectId = objectId;
}
public String getSipDirectConnectUri() {
return sipDirectConnectUri;
}
public void setSipDirectConnectUri(String sipDirectConnectUri) {
this.sipDirectConnectUri = sipDirectConnectUri;
}
public String getSipIdentityAddress() {
return sipIdentityAddress;
}
public void setSipIdentityAddress(String sipIdentityAddress) {
this.sipIdentityAddress = sipIdentityAddress;
}
public String getSipIdentityContactURI() {
return sipIdentityContactURI;
}
public void setSipIdentityContactURI(String sipIdentityContactURI) {
this.sipIdentityContactURI = sipIdentityContactURI;
}
public Password getSipIdentityPassword() {
return sipIdentityPassword;
}
public void setSipIdentityPassword(Password sipIdentityPassword) {
this.sipIdentityPassword = sipIdentityPassword;
}
public String getSipIdentityRealm() {
return sipIdentityRealm;
}
public void setSipIdentityRealm(String sipIdentityRealm) {
this.sipIdentityRealm = sipIdentityRealm;
}
public String getSipUsername() {
return sipUsername;
}
public void setSipUsername(String sipUsername) {
this.sipUsername = sipUsername;
}
public ToggleSwitch getSipSubscriberTemplateEnable() {
return sipSubscriberTemplateEnable;
}
public void setSipSubscriberTemplateEnable(
ToggleSwitch sipSubscriberTemplateEnable) {
this.sipSubscriberTemplateEnable = sipSubscriberTemplateEnable;
}

public VersionedSipSubscriberConfigProfile getVerSipSubscriberProfile() {
return verSipSubscriberProfile;
}
public void setVerSipSubscriberProfile(
VersionedSipSubscriberConfigProfile verSipSubscriberProfile) {
this.verSipSubscriberProfile = verSipSubscriberProfile;
//TODO
/*
* This needs to be done so that the Usage State changes to DEPLOY at the first
* instance this profile is used
*/
//this.subscriberProfile.setUsageState( UsageState.USAGE_DEPLOY );
}
public ToggleSwitch getSipBridgedLineUriEnable() {
return sipBridgedLineUriEnable;
}
public void setSipBridgedLineUriEnable(ToggleSwitch sipBridgedLineUriEnable) {
this.sipBridgedLineUriEnable = sipBridgedLineUriEnable;
}
public ToggleSwitch getSipDirectConnectUriEnable() {
return sipDirectConnectUriEnable;
}
public void setSipDirectConnectUriEnable(ToggleSwitch sipDirectConnectUriEnable) {
this.sipDirectConnectUriEnable = sipDirectConnectUriEnable;
}
public ToggleSwitch getSipMessageEventUriEnable() {
return sipMessageEventUriEnable;
}
public void setSipMessageEventUriEnable(ToggleSwitch sipMessageEventUriEnable) {
this.sipMessageEventUriEnable = sipMessageEventUriEnable;
}
public MObjectId getNeMobjectId() {
return neMobjectId;
}
public void setNeMobjectId(MObjectId neMobjectId) {
this.neMobjectId = neMobjectId;
}
public MObjectId getCurrentSipSubscriberProfile() {
return currentSipSubscriberProfile;
}
public void setCurrentSipSubscriberProfile(MObjectId currentSipSubscriberProfile) {
this.currentSipSubscriberProfile = currentSipSubscriberProfile;
}
public MObjectType getCurrentSipSubscriberProfileType() {
return currentSipSubscriberProfileType;
}
public void setCurrentSipSubscriberProfileType(
MObjectType currentSipSubscriberProfileType) {
this.currentSipSubscriberProfileType = currentSipSubscriberProfileType;
}
public MObjectType getObjectType() {
return objectType;
}
public void setObjectType(MObjectType objectType) {
this.objectType = objectType;
}
public PrivacySettings getSipIotParametersPrivacy() {
return sipIotParametersPrivacy;
}
public void setSipIotParametersPrivacy(PrivacySettings privacy) {
this.sipIotParametersPrivacy = privacy;
}
public ToggleSwitch getSipIotParametersEnableStatus() {
return sipIotParametersEnableStatus;
}
public void setSipIotParametersEnableStatus(ToggleSwitch sipIotParametersEnableStatus) {
this.sipIotParametersEnableStatus = sipIotParametersEnableStatus;
}
public ToggleSwitch getSipIotParametersSupport100Rel() {
return sipIotParametersSupport100Rel;
}
public void setSipIotParametersSupport100Rel(ToggleSwitch support100Rel) {
this.sipIotParametersSupport100Rel = support100Rel;
}
public ToggleSwitch getSipIotParametersRequire100Rel() {
return sipIotParametersRequire100Rel;
}
public void setSipIotParametersRequire100Rel(ToggleSwitch require100Rel) {
this.sipIotParametersRequire100Rel = require100Rel;
}
public ToggleSwitch getSipPreferredIDMode() {
return sipPreferredIDMode;
}
public void setSipPreferredIDMode(ToggleSwitch sipPreferredIDMode) {
this.sipPreferredIDMode = sipPreferredIDMode;
}
public String getSipPreferredID() {
return sipPreferredID;
}
public void setSipPreferredID(String sipPreferredID) {
this.sipPreferredID = sipPreferredID;
}
public Properties getProperties(boolean enableSipIotParams)
{
String QUOTES= "\"";
Properties props = new Properties();

props.setProperty("AddressOfRecord",QUOTES + ( getSipIdentityAddress() != null ? getSipIdentityAddress() : "" )+ QUOTES);
props.setProperty("Realm", QUOTES + ( getSipIdentityRealm() != null ? getSipIdentityRealm() : "" )+ QUOTES);
props.setProperty("Password", QUOTES + ( getSipIdentityPassword() != null ? getSipIdentityPassword().getPassword() : "" )+ QUOTES);
props.setProperty("ContactURIUser",QUOTES + ( getSipIdentityContactURI() != null ? getSipIdentityContactURI() : "" )+ QUOTES);
props.setProperty("username",QUOTES + ( getSipUsername() != null ? getSipUsername() : "" )+ QUOTES);
if ( getSipDirectConnectUriEnable() != null && getSipDirectConnectUriEnable().equals( ToggleSwitch.ENABLE ))
{
props.setProperty("DirectConnectURI",QUOTES + ( getSipDirectConnectUri() != null ? getSipDirectConnectUri() : "" )+ QUOTES);
}
if ( getSipMessageEventUriEnable() != null && getSipMessageEventUriEnable().equals(ToggleSwitch.ENABLE) )
{
props.setProperty("message_event_uri",QUOTES + ( getMessageEventUri() != null ? getMessageEventUri() : "" )+ QUOTES);
}
if ( getSipBridgedLineUriEnable() != null && getSipBridgedLineUriEnable().equals( ToggleSwitch.ENABLE ) )
{
props.setProperty("bridged_line_uri",QUOTES + ( getBridgedLineUri() != null ? getBridgedLineUri() : "" )+ QUOTES);
props.setProperty("bridged_line_dialog_uri",QUOTES + ( getBridgedLineDialogUri() != null ? getBridgedLineDialogUri() : "" )+ QUOTES);
}
if(enableSipIotParams && getSipIotParametersEnableStatus() != null && getSipIotParametersEnableStatus() == ToggleSwitch.ENABLE ){

String privacy="";
if ( getSipIotParametersPrivacy() != null)
{
if(getSipIotParametersPrivacy() == PrivacySettings.ID)
privacy="id";
else if(getSipIotParametersPrivacy() == PrivacySettings.NONE)
privacy="none";
else if(getSipIotParametersPrivacy() == PrivacySettings.NULL)
privacy="";
}

props.setProperty("Privacy", QUOTES + privacy + QUOTES);
props.setProperty("Support100Rel", QUOTES + ( getSipIotParametersSupport100Rel() != null ?
getSipIotParametersSupport100Rel().getValue() : ToggleSwitch.DISABLE.getValue() )+ QUOTES);
props.setProperty("Require100Rel", QUOTES + ( getSipIotParametersRequire100Rel() != null ?
getSipIotParametersRequire100Rel().getValue() : ToggleSwitch.DISABLE.getValue() )+ QUOTES);
props.setProperty("Mode", QUOTES + ( getSipPreferredIDMode() != null ?
getSipPreferredIDMode().getValue() : ToggleSwitch.DISABLE.getValue() ) + QUOTES);
props.setProperty("ID", QUOTES + ( getSipPreferredID() != null ? getSipPreferredID() : "" )+ QUOTES);
}

//TODO Check this
// if ( sipSubscriberTemplateEnable != null && sipSubscriberTemplateEnable.equals(ToggleSwitch.ENABLE) )
// {
// Properties templProps = subscriberProfile.getProperties();
// Enumeration<?> propNames = templProps.propertyNames();
//
// while ( propNames.hasMoreElements() )
// {
// Object key = propNames.nextElement() ;
// props.setProperty(key.toString(), templProps.getProperty( key.toString() ));
// }
// }
return props;
}
}

回答by Stefan Steinegger

Most probably, one of the properties of your entity does not return the exact same value that is set by hibernate after loading. Do you have some if statements like null handling or anything like this in a getter or setter?

最有可能的是,您的实体的属性之一不会返回加载后由 hibernate 设置的完全相同的值。在 getter 或 setter 中是否有一些 if 语句,例如空处理或类似的东西?

回答by MayurB

An upgrade lock. Objects loaded in this lock mode are materialized using an SQL select ... for update.

升级锁。在此锁定模式下加载的对象使用 SQL select ... for update 实现。

LockOption.Upgrade

LockOption.Upgrade

It is same as select for updatein sql

与sql中的select for update相同

If you dont want select for update remove the following code and run again

如果您不想选择更新,请删除以下代码并再次运行

if(isLocked)
{ 
  c.setLockMode("this", LockMode.UPGRADE); 
}

回答by Reddymails

I had the same issue where a select statement after firing select would end up in a update statement. This happened after I moved from websphere 7.0 to Jboss 7.0.

我遇到了同样的问题,即触发 select 后的 select 语句最终会出现在更新语句中。这是在我从 websphere 7.0 迁移到 Jboss 7.0 之后发生的。

The Object had String property where as select was returning "Y" or "N" so hibernate triggered an updated thinking the value of object was changed.

对象具有 String 属性,其中选择返回“Y”或“N”,因此休眠触发了更新,认为对象的值已更改。

ALL I did was in in my hbm.xml I marked that property to update="false".

我所做的只是在我的 hbm.xml 中,我将该属性标记为 update="false"。

<property name="someStringProperty" type="string" update="false"/>