Lau*_*ire 49
另一种实现方式更简单.
这其中的工作原理与两个基于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);
}
}
Run Code Online (Sandbox Code Playgroud)
回答练习(使用装饰器模式,按要求),未经过实际测试:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Kev*_*vin 45
它适用于我的项目,代码如下:
@XmlAttribute
@Id
@Basic(optional = false)
@GeneratedValue(strategy=GenerationType.IDENTITY, generator="IdOrGenerated")
@GenericGenerator(name="IdOrGenerated",
strategy="....UseIdOrGenerate"
)
@Column(name = "ID", nullable = false)
private Integer id;
Run Code Online (Sandbox Code Playgroud)
和
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();
}
}
Run Code Online (Sandbox Code Playgroud)
您基本上定义了自己的ID生成器(基于Identity策略),如果未设置ID,则将生成委派给默认生成器.
主要的缺点是它将你作为JPA提供程序绑定到Hibernate ...但它与我的MySQL项目完美配合
Cad*_*sto 17
更新LaurentGrégoire对hibernate 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);
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:(替换包名)
@Id
@GenericGenerator(name = "UseExistingIdOtherwiseGenerateUsingIdentity", strategy = "{package}.UseExistingIdOtherwiseGenerateUsingIdentity")
@GeneratedValue(generator = "UseExistingIdOtherwiseGenerateUsingIdentity")
@Column(unique = true, nullable = false)
protected Integer id;
Run Code Online (Sandbox Code Playgroud)
小智 6
我在这里给出了一个对我有用的解决方案:
创建自己的识别器/序列生成器
public class FilterIdentifierGenerator extends IdentityGenerator implements IdentifierGenerator{
@Override
public Serializable generate(SessionImplementor session, Object object)
throws HibernateException {
// TODO Auto-generated method stub
Serializable id = session.getEntityPersister(null, object)
.getClassMetadata().getIdentifier(object, session);
return id != null ? id : super.generate(session, object);
}
}
Run Code Online (Sandbox Code Playgroud)
将您的实体修改为:
@Id
@GeneratedValue(generator="myGenerator")
@GenericGenerator(name="myGenerator", strategy="package.FilterIdentifierGenerator")
@Column(unique=true, nullable=false)
private int id;
...
Run Code Online (Sandbox Code Playgroud)
而保存而不是persist()使用merge()或update()
如果您使用休眠模式org.hibernate.id.UUIDGenerator生成String ID,建议您使用:
public class UseIdOrGenerate extends UUIDGenerator {
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27826 次 |
| 最近记录: |