我知道这种方法会惹恼你们中的某些人,因为这并不是版本注解的原意,但是我想知道是否有人可以告诉我下面的方法是否可行?
我已经成功实现了对字符串的UserType和UserVersionType重写,但是我想对可嵌入类进行重写。本质上,此类具有3个ID字段,我也希望使用此机制进行填充。因此,我完成了以下操作(在将用户类型添加到公式中之前,一切正常,一切正常)...
//Standard hibernate code
@Embeddable
public class TestType implements Serializable
{
@Transient
public Class getUnderlyingClass() { return TestVersionType.class;}
@Column(name="`id1`", nullable=false, length = 100)
private java.lang.String id1 = UUID.randomUUID().toString();
@Column(name="`id2`", nullable=false, length = 100)
private java.lang.String id2;
@Column(name="`id3`", nullable=false, length = 100)
public java.lang.String getId1() {
return id1;
}
public void setId1(java.lang.String value) {
this.id1= value;
}
public int compareTo(TestType b) {
if (Id1.equals(b.Id1)) {
return 0;
} else {
return -1;
}
}
}
@Entity
@Table (name="`hib_test`")
public class HibernateTest implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="seq-gen", sequenceName="seq", allocationSize=1)
@GeneratedValue (strategy=GenerationType.SEQUENCE, generator="seq-gen")
@Column(name="`id`", nullable=false)
private Long id;
@Column(name="`NAME`", length=100)
private String name;
@Type(type = "com.proto.usertypes.TestType")
@Version
@Embedded
@AttributeOverrides({
@AttributeOverride(name="id1", column=@Column(name="`id1_in_testtype`"))
,@AttributeOverride(name="id2", column=@Column(name="`id2_in_testtype`"))
,@AttributeOverride(name="id3", column=@Column(name="`id3_in_testtype`"))
})
private TestType testType;
public TestType getTestType() {
return testType;
}
...
}
问题是我不太确定如何将TestObject映射到3个varchar数据库字段(id1,id2和id3)。
public class TestTypeUserType implements UserType {
protected TestType val;
public int[] sqlTypes() {
return new int[] { Types.? };
}
public Class<TestType> returnedClass() {
return TestType.class;
}
...
}
我尝试了许多类型,但是所有返回都带有一定的相似性 “ JDBC类型没有方言映射:2000”。我不认为JAVA_OBJECT是正确的,因为我没有映射到特定的数据库类型,但是也许我错了(只是我所看到的所有示例都针对尚未实现休眠的数据库类型而不是创建虚拟的db类型)。 STRUCT和ARRAY也失败了。
是否存在将UserType映射到由嵌入式类创建的3个字段的机制?
谢谢。