Как сопоставить перечисление PostgreSQL с JPA и Hibernate

Я пытаюсь сопоставить пользовательский тип postgres с именем transmission_result с Hibernate/JPA POJO. Пользовательский тип postgres является более или менее перечислительным типом строковых значений.

Я создал пользовательский EnumUserType с именем PGEnumUserType, а также класс перечисления, представляющий перечисляемые значения postgres. Когда я запускаю это по реальной базе данных, я получаю следующую ошибку: 'ОШИБКА: столбец «status» имеет тип transmission_result но выражение имеет изменяющийся символ типа Подсказка: Вам нужно будет переписать или привести выражение. Позиция: 135 '

Увидев это, я решил, что мне нужно изменить SqlTypes на Types.OTHER. Но это приводит к разрыву интеграционных тестов (с использованием SunSQL в БД памяти) с сообщением: 'Вызванный: java.sql. SQLException: Стол, не найденный в заявлении [выбирает enrollment0_. «id» как id1_47_0 _, enrollment0_. «tpa_approval_id» как tpa2_47_0 _, enrollment0_. «tpa_status_code» как tpa3_47_0 _, enrollment0_. «status_message» как status4_47_0 _, enrollment0_. «approval_id» как approval5_47_0 _, enrollment0_. «transmission_date» как transmis6_47_0 _, enrollment0_. «статус» как status7_47_0 _, enrollment0_. «передатчик» как transmit8_47_0_ от «передач» enrollment0_, где enrollment0_. «id» =?]'

я не уверен, почему изменение sqlType приводит к этой ошибке. Любая помощь ценится.

JPA/Hibernate Entity:

@Entity
@Access(javax.persistence.AccessType.PROPERTY)
@Table(name="transmissions")
public class EnrollmentCycleTransmission {

// elements of enum status column
private static final String ACCEPTED_TRANSMISSION = "accepted";
private static final String REJECTED_TRANSMISSION = "rejected";
private static final String DUPLICATE_TRANSMISSION = "duplicate";
private static final String EXCEPTION_TRANSMISSION = "exception";
private static final String RETRY_TRANSMISSION = "retry";

private Long transmissionID;
private Long approvalID;
private Long transmitterID;
private TransmissionStatusType transmissionStatus;
private Date transmissionDate;
private String TPAApprovalID;
private String TPAStatusCode;
private String TPAStatusMessage;


@Column(name = "id")
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getTransmissionID() {
    return transmissionID;
}

public void setTransmissionID(Long transmissionID) {
    this.transmissionID = transmissionID;
}

@Column(name = "approval_id")
public Long getApprovalID() {
    return approvalID;
}

public void setApprovalID(Long approvalID) {
    this.approvalID = approvalID;
}

@Column(name = "transmitter")
public Long getTransmitterID() {
    return transmitterID;
}

public void setTransmitterID(Long transmitterID) {
    this.transmitterID = transmitterID;
}

@Column(name = "status")
@Type(type = "org.fuwt.model.PGEnumUserType" , parameters ={@org.hibernate.annotations.Parameter(name = "enumClassName",value = "org.fuwt.model.enrollment.TransmissionStatusType")} )
public TransmissionStatusType getTransmissionStatus() {
    return this.transmissionStatus ;
}

public void setTransmissionStatus(TransmissionStatusType transmissionStatus) {
    this.transmissionStatus = transmissionStatus;
}

@Column(name = "transmission_date")
public Date getTransmissionDate() {
    return transmissionDate;
}

public void setTransmissionDate(Date transmissionDate) {
    this.transmissionDate = transmissionDate;
}

@Column(name = "tpa_approval_id")
public String getTPAApprovalID() {
    return TPAApprovalID;
}

public void setTPAApprovalID(String TPAApprovalID) {
    this.TPAApprovalID = TPAApprovalID;
}

@Column(name = "tpa_status_code")
public String getTPAStatusCode() {
    return TPAStatusCode;
}

public void setTPAStatusCode(String TPAStatusCode) {
    this.TPAStatusCode = TPAStatusCode;
}

@Column(name = "status_message")
public String getTPAStatusMessage() {
    return TPAStatusMessage;
}

public void setTPAStatusMessage(String TPAStatusMessage) {
    this.TPAStatusMessage = TPAStatusMessage;
}
}

Пользовательский EnumUserType:

public class PGEnumUserType implements UserType, ParameterizedType {

private Class<Enum> enumClass;

public PGEnumUserType(){
    super();
}

public void setParameterValues(Properties parameters) {
    String enumClassName = parameters.getProperty("enumClassName");
    try {
        enumClass = (Class<Enum>) Class.forName(enumClassName);
    } catch (ClassNotFoundException e) {
        throw new HibernateException("Enum class not found ", e);
    }

}

public int[] sqlTypes() {
    return new int[] {Types.VARCHAR};
}

public Class returnedClass() {
    return enumClass;
}

public boolean equals(Object x, Object y) throws HibernateException {
    return x==y;
}

public int hashCode(Object x) throws HibernateException {
    return x.hashCode();
}

public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
    String name = rs.getString(names[0]);
    return rs.wasNull() ? null: Enum.valueOf(enumClass,name);
}

public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
    if (value == null) {
        st.setNull(index, Types.VARCHAR);
    }
    else {
        st.setString(index,((Enum) value).name());
    }
}

public Object deepCopy(Object value) throws HibernateException {
    return value;
}

public boolean isMutable() {
    return false;  //To change body of implemented methods use File | Settings | File Templates.
}

public Serializable disassemble(Object value) throws HibernateException {
    return (Enum) value;
}

public Object assemble(Serializable cached, Object owner) throws HibernateException {
    return cached;
}

public Object replace(Object original, Object target, Object owner) throws HibernateException {
    return original;
}

public Object fromXMLString(String xmlValue) {
    return Enum.valueOf(enumClass, xmlValue);
}

public String objectToSQLString(Object value) {
    return '\'' + ( (Enum) value ).name() + '\'';
}

public String toXMLString(Object value) {
    return ( (Enum) value ).name();
}
}

Класс перечисления:

public enum TransmissionStatusType {
accepted,
rejected,
duplicate,
exception,
retry}
-121--1355156- Передача файлов UDP - Да, UDP У меня есть требование создать систему передачи файлов UDP. Я знаю, что TCP гарантирован и гораздо надежнее, но мне нужно передавать огромные файлы между локациями и я думаю, что скорость преимущество в этом...

У меня есть требование создать систему передачи файлов UDP. Я знаю, что TCP гарантирован и гораздо надежнее, но мне нужно передавать огромные файлы между локациями, и я думаю, что преимущество скорости в этом проекте перевешивает преимущества использования TCP. Я только начинаю этот проект, но хотел бы получить руководство, если кто-то делал это раньше. Я буду писать обе стороны (клиент и сервер), поэтому мне не нужно беспокоиться об ограничениях функций в других продуктах.

В двух словах мне нужно:

  • Взять большие файлы и отправить их порциями
  • Иметь возможность регулировать полосу пропускания от клиента
  • Создать какую-то систему нумерации пакетов для ошибок, повторные передачи и сборка файлов по частям на сервере (да, все вещи, которые мы получаем от TCP бесплатно: -)
  • Конфигурируемый размер дейтаграммы - я думаю, некоторые брандмауэры жалуются, если они слишком большой?
  • Что-либо еще, что я могу пропустить

Я начинаю это путешествие с помощью UdpClient и хотел бы написать это приложение на C #. Любые слова мудрости (кроме использования TCP)?


Это было сделано с огромным успехом. Мы использовали RocketStream.com,но они продали свой продукт другой компании только для внутреннего использования. Обычно мы получаем скорости, которые 30X быстрее, чем передачи байтов FTP или необработанных TCP.

5
задан Henk Holterman 29 September 2011 в 21:56
поделиться