我正在使用 Hibernate 3.6 的环境。我正在尝试实现一个使用 java.util 中的 UUID 作为 PK 的 MySQL 表,这些 UUID 是从 EntityImage 定义的多个字符串生成的。这是我用来生成这些密钥的代码。
public class EntityIDGenerator implements IdentifierGenerator {
...
private UUID generateUUID(String str) {
return UUID.nameUUIDFromBytes(str.getBytes());
}
public UUID generateUUID(EntityImage image) {
return generateUUID(image.getEntityId()+image.getEntityType().toUpperCase()+image.getFilename().toUpperCase());
}
...
public Serializable generate(SessionImplementor session, Object object)
throws HibernateException {
if(object instanceof EntityImage) {
return generateUUID((EntityImage)object);
}
return null;
}
}
在这里他是我的冬眠
<class name="EntityImage" table="entity_image">
<id name="id" column="id" type="entityUUID" unsaved-value="null">
<generator class="com.covelo.energy.score.db.EntityIDGenerator" />
</id>
<property name="entityId" type="int"/>
<property name="entityType" type="string" length="45" />
<property name="filename" type="string" length="90" />
<property name="fileType" type="string" length="5"/>
<property name="imageData" type="binary" column="image_data"/>
</class>
使用我当前的设置,我只能让它以一种方式工作,自己生成 UUID 并检查 Hibernate 中是否存在密钥,然后相应地调用保存或更新(或者只是将 UUID 分别设置为 null 或值)
这种方式似乎是错误的,特别是对于实现这个 PK 生成器。理想情况下,Hibernate 会使用我的 IdentifierGenerator 生成一个 PK,然后检查它是否存在并更新或保存它。我的架构是错误的还是在休眠中有一种方法可以做到这一点?
注意:我很清楚 saveOrUpdate 的工作原理Hibernate 文档
-提前致谢。内德