Я знаю, что этот подход будет раздражать некоторых из вас, так как это совсем не то, как аннотация версии предназначена для использования, но я задавался вопросом, может ли кто-нибудь сказать мне, возможно ли приведенное ниже в любом случае?
Я успешно реализовал переопределение UserType и UserVersionType для строк, но я хотел сделать это для встраиваемого класса. По сути, этот класс имеет 3 поля идентификаторов, которые я надеюсь также использовать этот механизм для заполнения. Поэтому я сделал следующее (все отлично работает, прежде чем я добавлю свой тип пользователя в уравнение) ...
//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;
}
...
}
Я пробовал несколько типов, но все возвращалось с somethign в соответствии с
Msgstr "Нет отображения диалекта для типа JDBC: 2000". Я не думаю, что JAVA_OBJECT является правильным, потому что я не сопоставляюсь с определенным типом базы данных, но, возможно, я ошибаюсь (просто все примеры этого, которые я видел, относятся к типам БД, которые еще не имеют реализации Hibernate вместо создания фиктивного типа БД). STRUCT и ARRAY также не удалось.
Существует ли механизм для сопоставления UserType с 3 полями, созданными встроенным классом?
Спасибо.