การแม็พ enum กับสตริงในโหมดไฮเบอร์เนต


93

ฉันมีโมเดล Category Hibernate:

@Entity
@Table(name = "category")
public class Category {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private long id;

    @Column(name = "type")
    private String type;

ซึ่งมีฟิลด์สตริงประเภท นอกจากนี้ฉันยังมี Java enum ซึ่งแสดงถึงประเภทของหมวดหมู่:

public enum CategoryType {
    INCOME, OUTCOME;
}

ซึ่งฉันต้องการใช้แทนประเภทสตริง สร้าง SQL ยอมรับสองค่าที่แตกต่างกันในพารามิเตอร์ varchar นี้อย่างใดอย่างหนึ่งหรือCategoryIncome CategoryOutcomeฉันต้องการให้คลาสโมเดลประเภทยอมรับตัวแปร enum - และแมปกับสตริงเมื่อใดก็ตามที่ไฮเบอร์เนตขอ

เป็นไปได้ไหม?

คำตอบ:


184

ใช่เป็นไปได้ มันควรจะเป็น:

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;

15
คุณยังสามารถไปต่อไปและตอนนี้เป็น JPA 2.1 ถูกปล่อยออกมาใช้@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
membersound

6
สำหรับใครก็ตามที่อาจมีปัญหาเดียวกัน .. : ฉันต้องใส่คำอธิบายประกอบนี้ลงในวิธี getter ของฉันแทนฟิลด์ดังนี้: @Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }.
ZeroOne

ฉันอยู่ในhibernate.ddl-auto=updateโหมดและฉันต้องวางตารางของฉันและปล่อยให้ไฮเบอร์เนตสร้างมันอีกครั้งเพื่อที่จะแปลง enum ของฉันจาก int เป็น varchar หวังว่าจะช่วยคนที่มีปัญหาคล้ายกัน
Arashsoft

ดูstackoverflow.com/questions/44864675/…หากค่าการแจงนับของคุณถูกเขียนเป็นลำดับแม้จะมีคำอธิบายประกอบแบบแจกแจง
metamaker

ฉันไม่ได้ใส่มันลงบน getter การวางไว้ในการประกาศตัวแปรนั้นใช้ได้ดีซึ่งเป็นสิ่งที่ดีสำหรับ Lombok โดยใช้ @Data เป็นต้นจะเป็นอย่างไรหากฉันต้องการใช้สิ่งนี้กับ Enums ทั้งหมดโดยไม่ต้องใส่คำอธิบายประกอบแต่ละรายการ
Andrew

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.