3 回答
TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
它可以通過以下代碼在我的項(xiàng)目中運(yùn)行:
@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策略),如果未設(shè)置ID,則將生成委托給默認(rèn)生成器。
主要缺點(diǎn)是它使您無法將Hibernate用作JPA提供程序...但是它與我的MySQL項(xiàng)目完美配合
TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
另一個(gè)實(shí)現(xiàn),方法更簡(jiǎn)單。
這其中的工作原理與兩個(gè)基于XML注釋或基于配置:它依靠休眠元數(shù)據(jù)中獲取價(jià)值為對(duì)象的ID。根據(jù)您的配置替換SequenceGenerator為IdentityGenerator(或任何其他生成器)。(創(chuàng)建裝飾器而不是子類,將裝飾的ID生成器作為參數(shù)傳遞給此生成器,作為練習(xí)留給讀者)。
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);
}
}
練習(xí)的答案(根據(jù)要求使用裝飾器模式),未經(jīng)過實(shí)際測(cè)試:
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);
}
}
TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
更新LaurentGrégoire對(duì)于休眠5.2的答案,因?yàn)樗坪跤兴摹?/p>
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;
添加回答
舉報(bào)
