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

时间:2013-08-13 08:26:49

标签: java sql database hibernate jpa

在这种情况下有人帮助我吗?我正在使用hibernate从db中选择数据,但是当我从sql调试日志中检查时。我总是看到在使用“select”sql从DB获取数据后打印的更新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 = ?  

谢谢

编辑:获取数据的代码:

 @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; 
 } 

实体类如下:

@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;
}
}

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:0)

升级锁定。在此锁定模式下加载的对象使用SQL select ...进行更新。

LockOption.Upgrade

与sql

中的select for update相同

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

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

答案 2 :(得分:0)

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

Object具有String属性,其中select返回“Y”或“N”,因此hibernate触发了更新的思维,对象的值发生了变化。

我所做的就是在我的hbm.xml中我将该属性标记为update =“false”。

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