Hazırda Bekletme'de Numaralar


82

Bir DAO'da değeri Java numaralandırmasından gelen bir alana sahip olmak genellikle yararlıdır. Tipik bir örnek, genellikle kullanıcıyı "NORMAL" veya "ADMIN" olarak nitelendiren bir alana sahip olduğunuz oturum açma DAO'sudur. Hazırda Bekletme modunda, bu ilişkiyi (yarı) tip güvenli bir şekilde temsil etmek için aşağıdaki 2 nesneyi kullanırdım:

class User {
    String username;
    String passwd;
    UserType type;
}

class UserType {
    private enum Type {ADMIN, NORMAL};
    private String type;

    //Setters/Getters for Hibernate
    public void setType(String type);
    public String getType();

    //Setters/Getters for user
    public void setUserType(UserType.Type t);
    public UserType.Type getUserType();

    public static UserType fromType(UserType.Type t);
}

Bu işe yarıyor, ancak UserType sınıfını kaba buluyorum ve sadece birkaç değeri depolamak için çok fazla bürokrasi gerektiriyor. İdeal olarak, Hibernate enum alanlarını doğrudan desteklemeli ve numaralandırma değerlerini depolamak için fazladan bir tablo oluşturmalıdır.

Sorum şu: Hibernate'de bir numaralandırma sınıfını doğrudan eşleştirmenin bir yolu var mı? Değilse, numaralandırmaları temsil etme modelim yeterince iyi mi yoksa bir şeyi mi kaçırıyorum? İnsanlar başka hangi kalıpları kullanıyor?

Yanıtlar:


110

hazırda bekletme veya JPA ek açıklamalarını kullanma:

class User {
   @Enumerated(EnumType.STRING)
   UserType type
}

UserType yalnızca standart bir java 5 numaralandırmasıdır.

Bunun sadece ek açıklamalarla sınırlı olduğunu hayal edemiyorum ama aslında bunu hbm dosyalarıyla nasıl yapacağımı bilmiyorum. Sürüme çok bağlı olabilir, tahmin ediyorum ama 3.2+ hazırda bekletme modunun gerekli olduğundan oldukça eminim.

düzenleme: bir hbm'de mümkündür, ancak biraz dağınıktır, bu forum başlığına bir göz atın


3
@Enumerated (EnumType.ORDINAL) hangi int ile daha verimli eşleşebilir?
Lee Chee Kiam

4
Muhtemelen daha verimlidir, ancak gerçek bir sistemdeki farkı ölçememek için para koyardım. EnumType.ORDINAL, @ Numaralandırmayı yaparsanız, aslında varsayılandır. Bence çoğu insan (özellikle DBA'lar) DB'deki enum adını tercih etme eğilimindedir.
Gareth Davis

1
Bu numaralandırmalar için sütun uzunluğunu nasıl değiştirebilirim? Sütun ek açıklamasını eklemeyi denedim ama bu kabul görmüyor mu?
Kannan Ekanath

2
Bunu başka bir soru olarak sormalısın.
Gareth Davis

2
Sıraya bakılmaksızın Enum'a ek öğeler eklemenize izin verdiği için ORDINAL yerine STRING kullanın.
Matthew Daumen

14

Hazırda Bekletme belgelerinden: http://www.hibernate.org/272.html

Numaralandırmalarınızın her biri için yeni bir typedef oluşturabilir ve özellik etiketinde typedef'lere referans verebilirsiniz.

Örnek Eşleme - satır içi <type>etiket

  <property name='suit'>
    <type name="EnumUserType">
      <param name="enumClassName">com.company.project.Suit</param>
    </type>
  </property>

Örnek Eşleme - kullanma <typedef>

  <typedef name="suit" class='EnumUserType'>
      <param name="enumClassName">com.company.project.Suit</param>
  </typedef>

  <class ...>
    <property name='suit' type='suit'/>
  </class>

Teşekkürler. Bu çözümün zaten farkındaydım. Sorun şu ki, benim durumumda olduğu gibi DAO'ları DTO'lar olarak kullanıyorsanız, tüm numaralandırmalarınızın hazırda bekletme dahili türleri kullanmasını gerektirmesi sorunlara neden olabilir. Aslında daha iyi bir çözüm burada açıklanmaktadır: hibernate.org/273.html
Georgios Gousios

1
Daha yeni sürümlerde parametre adının enumClassyerine olduğunu unutmayın enumClassName.
Ryan Ransford
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.