Java Hibernate:在没有表的情况下按字段加载类

Java Hibernate:在没有表的情况下按字段加载类,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我有一个带有固定常量集的Ink类。它们永远不会改变,我不想将这个类存储为表 public final class Ink { public static final Ink Y = new Ink(91001, 'y', 90.70, -5.23, 94.37), "Yellow"); public static final Ink M = new Ink(92001, 'm', 48.19, 72.01, -1.78), "Magenta"); public s

我有一个带有固定常量集的
Ink
类。它们永远不会改变,我不想将这个类存储为表

public final class Ink {
    public static final Ink Y = new Ink(91001, 'y', 90.70,  -5.23,  94.37), "Yellow");
    public static final Ink M = new Ink(92001, 'm', 48.19,  72.01,  -1.78), "Magenta");
    public static final Ink C = new Ink(93001, 'c', 56.46, -41.00, -43.50), "Cyan");
    public static final Ink K = new Ink(94001, 'k', 18.64,   1.80,   5.21), "Black");      

    public int code;

    public static Ink forCode(int code) {
        //...
    }

    //...
}
其他类可以有
Ink
Collection inks
字段,但每个
Ink
实例都必须映射为一个简单的整数列,并且只包含其
code
code
不是外键什么的——它是一个简单的整数值,我总是可以从中获得
Ink
实例

@Entity
public class Order {
     //...
     @OneToMany    
     public Set<Ink> inks;
     //...
}
public Enum Ink {
    Y = new Ink(91001, 'y', 90.70,  -5.23,  94.37), "Yellow");
    M = new Ink(92001, 'm', 48.19,  72.01,  -1.78), "Magenta");
    C = new Ink(93001, 'c', 56.46, -41.00, -43.50), "Cyan");
    K = new Ink(94001, 'k', 18.64,   1.80,   5.21), "Black"); 

    .....     

    private static Ink (...) {
        ...
    }
}
但问题是:


如何防止Hibernate将类映射为表,并且在Java代码中存储墨迹时仍从其
code
列加载class字段?

。因此,您应该自己实现加载操作。首先,可以通过注释@Transient防止Hibernate将类映射为表。然后您可以在加载订单后处理加载操作:

public interface Inked {
    getCode();
    setInk(Ink ink);
}

public abstract class AbstractEntity {

    @PostLoad
    public void loadInk() {
        if(this instanceof Inked){
            Inked inked = (Inked) this;
            inked.setInk(Ink.forCode(getCode()));
        }
    }
}

@Entity
public class Order extends AbstractEntity implement Inked {
    //...
    public Integer code;

    @Transient
    public Ink ink;
    //...

}

在Java代码中存储墨水时。因此,您应该自己实现加载操作。首先,可以通过注释@Transient防止Hibernate将类映射为表。然后您可以在加载订单后处理加载操作:

public interface Inked {
    getCode();
    setInk(Ink ink);
}

public abstract class AbstractEntity {

    @PostLoad
    public void loadInk() {
        if(this instanceof Inked){
            Inked inked = (Inked) this;
            inked.setInk(Ink.forCode(getCode()));
        }
    }
}

@Entity
public class Order extends AbstractEntity implement Inked {
    //...
    public Integer code;

    @Transient
    public Ink ink;
    //...

}

首先,您可以创建一个枚举来表示墨水实例。如果您可以将列更改为存储字符引用(Y、M、C、K),而不是编码,那么这将是最简单的解决方案。如果没有,则可以按照建议使用转换器将代码转换为枚举实例

@Entity
public class Order {
     //...
     @OneToMany    
     public Set<Ink> inks;
     //...
}
public Enum Ink {
    Y = new Ink(91001, 'y', 90.70,  -5.23,  94.37), "Yellow");
    M = new Ink(92001, 'm', 48.19,  72.01,  -1.78), "Magenta");
    C = new Ink(93001, 'c', 56.46, -41.00, -43.50), "Cyan");
    K = new Ink(94001, 'k', 18.64,   1.80,   5.21), "Black"); 

    .....     

    private static Ink (...) {
        ...
    }
}
如果保存Y、M、C、K,映射将如下所示。如果必须保存代码,则添加必要的转换器()

@实体
公共阶级秩序{
@元素集合
@收集表(…)
@枚举(EnumType.STRING)
公用油墨;
@枚举(EnumType.STRING)
私人墨水;
}

首先,您可以创建一个枚举来表示墨水实例。如果您可以将列更改为存储字符引用(Y、M、C、K),而不是编码,那么这将是最简单的解决方案。如果没有,则可以按照建议使用转换器将代码转换为枚举实例

@Entity
public class Order {
     //...
     @OneToMany    
     public Set<Ink> inks;
     //...
}
public Enum Ink {
    Y = new Ink(91001, 'y', 90.70,  -5.23,  94.37), "Yellow");
    M = new Ink(92001, 'm', 48.19,  72.01,  -1.78), "Magenta");
    C = new Ink(93001, 'c', 56.46, -41.00, -43.50), "Cyan");
    K = new Ink(94001, 'k', 18.64,   1.80,   5.21), "Black"); 

    .....     

    private static Ink (...) {
        ...
    }
}
如果保存Y、M、C、K,映射将如下所示。如果必须保存代码,则添加必要的转换器()

@实体
公共阶级秩序{
@元素集合
@收集表(…)
@枚举(EnumType.STRING)
公用油墨;
@枚举(EnumType.STRING)
私人墨水;
}

很好,但在这种情况下,我需要将
loadInk()
code
附加到具有
Ink
字段的每个实体。如果您有许多实体需要墨水。可能是你用界面做的。代码已更新。很好,但在这种情况下,我需要将loadInk()Code附加到具有Ink字段的每个实体。如果您有许多实体需要墨水。可能是你用界面做的。代码已更新。为什么Hibernate会将map Ink作为一个表,而它没有@Entity注释?没有兼容的JPA实现可以做到这一点。为什么Hibernate会将map Ink作为一个表,而它没有@Entity注释?没有兼容的JPA实现可以做到这一点。