Отображение встраиваемых классов в SqlType при реализации интерфейса Hibernate UserType - PullRequest
0 голосов
/ 09 мая 2019

Я знаю, что этот подход будет раздражать некоторых из вас, так как это совсем не то, как аннотация версии предназначена для использования, но я задавался вопросом, может ли кто-нибудь сказать мне, возможно ли приведенное ниже в любом случае?

Я успешно реализовал переопределение 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 полями, созданными встроенным классом?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...