亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Hibernate中繞過GeneratedValue(合并數據不在db中?)

在Hibernate中繞過GeneratedValue(合并數據不在db中?)

肥皂起泡泡 2019-09-24 16:19:08
我的問題與[1]或[2]中描述的相同。我需要手動設置默認情況下自動生成的值(為什么?導入舊數據)。如[1]中所述,使用Hibernate entity = em.merge(entity)可以解決問題。對我來說不幸的是事實并非如此。我既沒有收到錯誤,也沒有其他任何警告。該實體只是不會出現在數據庫中。我正在使用Spring和Hibernate EntityManager 3.5.3-Final。有任何想法嗎?
查看完整描述

3 回答

?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

它可以通過以下代碼在我的項目中運行:


@XmlAttribute

@Id

@Basic(optional = false)

@GeneratedValue(strategy=GenerationType.IDENTITY, generator="IdOrGenerated")

@GenericGenerator(name="IdOrGenerated",

                  strategy="....UseIdOrGenerate"

)

@Column(name = "ID", nullable = false)

private Integer id;


import org.hibernate.id.IdentityGenerator;

...

public class UseIdOrGenerate extends IdentityGenerator {

private static final Logger log = Logger.getLogger(UseIdOrGenerate.class.getName());


@Override

public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {

    if (obj == null) throw new HibernateException(new NullPointerException()) ;


    if ((((EntityWithId) obj).getId()) == null) {

        Serializable id = super.generate(session, obj) ;

        return id;

    } else {

        return ((EntityWithId) obj).getId();


    }

}

在這里,您基本上定義了自己的ID生成器(基于Identity策略),如果未設置ID,則將生成委托給默認生成器。


主要缺點是它使您無法將Hibernate用作JPA提供程序...但是它與我的MySQL項目完美配合


查看完整回答
反對 回復 2019-09-24
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

另一個實現,方法更簡單。


這其中的工作原理與兩個基于XML注釋或基于配置:它依靠休眠元數據中獲取價值為對象的ID。根據您的配置替換SequenceGenerator為IdentityGenerator(或任何其他生成器)。(創建裝飾器而不是子類,將裝飾的ID生成器作為參數傳遞給此生成器,作為練習留給讀者)。


public class UseExistingOrGenerateIdGenerator extends SequenceGenerator {

    @Override

    public Serializable generate(SessionImplementor session, Object object)

                        throws HibernateException {

        Serializable id = session.getEntityPersister(null, object)

                      .getClassMetadata().getIdentifier(object, session);

        return id != null ? id : super.generate(session, object);

    }

}

練習的答案(根據要求使用裝飾器模式),未經過實際測試:


public class UseExistingOrGenerateIdGenerator implements IdentifierGenerator, Configurable {


    private IdentifierGenerator defaultGenerator;


    @Override

    public void configure(Type type, Properties params, Dialect d) 

                        throws MappingException;

        // For example: take a class name and create an instance

        this.defaultGenerator = buildGeneratorFromParams(

                params.getProperty("default"));

    }


    @Override

    public Serializable generate(SessionImplementor session, Object object)

                        throws HibernateException {

        Serializable id = session.getEntityPersister(null, object)

                      .getClassMetadata().getIdentifier(object, session);

        return id != null ? id : defaultGenerator.generate(session, object);

    }

}


查看完整回答
反對 回復 2019-09-24
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

更新LaurentGrégoire對于休眠5.2的答案,因為它似乎有所更改。


public class UseExistingIdOtherwiseGenerateUsingIdentity extends IdentityGenerator {


    @Override

    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {

        Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session);

        return id != null ? id : super.generate(session, object);

    }

}

并像這樣使用它:(替換包名)


@Id

@GenericGenerator(name = "UseExistingIdOtherwiseGenerateUsingIdentity", strategy = "{package}.UseExistingIdOtherwiseGenerateUsingIdentity")

@GeneratedValue(generator = "UseExistingIdOtherwiseGenerateUsingIdentity")

@Column(unique = true, nullable = false)

protected Integer id;


查看完整回答
反對 回復 2019-09-24
  • 3 回答
  • 0 關注
  • 735 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號