मैं वर्तमान में हाइबरनेट में एक कस्टम टाइप मैपिंग लागू कर रहा हूं (ऑरैकल में इंडेक्स सेट करने के लिए यूयूआईडी को चार में मैप करना)। मैंने हाइबरनेट प्रकार UUIDType और UUIDJavaDescriptor को लागू किया और उन्हें @TypeDef के माध्यम से हमारे बेसएन्टिटी (JPAEntity) में जोड़ा। मुद्दा यह है कि कॉलम varchar(36) के बजाय varchar(255) के रूप में जेनरेट किए जा रहे हैं। @Column(length = 36, /* ... */) के माध्यम से यूयूआईडी फ़ील्ड को एनोटेट करना अपेक्षित काम करता है लेकिन मैं प्रोजेक्ट के भीतर सभी यूयूआईडी फ़ील्ड को एनोटेट नहीं करना चाहता हूं। क्या किसी को विश्व स्तर पर सभी यूयूआईडी क्षेत्रों की लंबाई को अनुकूलित करने का तरीका पता है?

public class UUIDType extends AbstractSingleColumnStandardBasicType<UUID> {
  public static final UUIDType INSTANCE = new UUIDType();
  public static final String NAME = "uuid";
  public static final Size SIZE = new Size(0, 0, 36, Size.LobMultiplier.NONE);
  // define the column size                      ^^^

  public UUIDType() {
    super(VarcharTypeDescriptor.INSTANCE, UUIDJavaDescriptor.INSTANCE);
  }

  @Override
  public String getName() {
    return NAME;
  }

  // Override size related methods
  @Override
  protected Size getDictatedSize() {
    return SIZE;
  }

  @Override
  public Size[] dictatedSizes(Mapping mapping) throws MappingException {
    return new Size[] { SIZE };
  }

  @Override
  public Size[] defaultSizes(Mapping mapping) throws MappingException {
    return new Size[] { SIZE };
  }
}
public class UUIDJavaDescriptor extends AbstractTypeDescriptor<UUID> {
  public static final UUIDJavaDescriptor INSTANCE = new UUIDJavaDescriptor();

  public UUIDJavaDescriptor() {
    super(UUID.class, ImmutableMutabilityPlan.INSTANCE);
  }

  @Override
  public UUID fromString(String string) {
    if (StringUtils.isEmpty(string)) return null;
    return UUID.fromString(string);
  }

  @Override
  public <X> X unwrap(UUID value, Class<X> type, WrapperOptions options) {
    if (value == null) {
      return null;
    }

    if (String.class.isAssignableFrom(type)) {
      return (X) toString(value);
    }

    throw unknownUnwrap(type);
  }

  @Override
  public <X> UUID wrap(X value, WrapperOptions options) {
    if (value == null) {
      return null;
    }

    if (String.class.isInstance(value)) {
      return UUID.fromString((String) value);
    }

    throw unknownWrap(value.getClass());
  }
}
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Getter
@Setter
@ToString(callSuper = true)
@MappedSuperclass
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@TypeDefs({
  @TypeDef(typeClass = UUIDType.class, defaultForType = UUID.class, name = UUIDType.NAME)
})
public abstract class JPAEntity {
 // ...
}

तकनीकी जानकारी:

  • अपाचे मावेन 3.6.3
  • ओपनजेडके 11.0.2
  • हाइबरनेट-कोर 5.4.30.अंतिम
3
webpapaya 1 सितंबर 2021, 12:47

1 उत्तर

सबसे बढ़िया उत्तर

आप इसे बदल नहीं सकते, क्योंकि 255 का मान javax.persistence.Column एनोटेशन से आता है। हाइबरनेट 6.0 इसे ठीक से संभाल लेगा, लेकिन अभी के लिए, आपको बस हर जगह लंबाई निर्धारित करनी होगी।

1
Christian Beikov 13 सितंबर 2021, 11:06