Java Hibernate,JPA忽略@Formula

Java Hibernate,JPA忽略@Formula,java,hibernate,jakarta-ee,jpa,persistence,Java,Hibernate,Jakarta Ee,Jpa,Persistence,我有一个公式定义为: @Entity @Table(name = "MyEntity") @org.hibernate.annotations.Table(appliesTo = "MyEntity") public class MyEntity { @Enumerated(value = javax.persistence.EnumType.STRING) @Transient @Formula(value = "select e.state from OTHER_EN

我有一个
公式定义为:

@Entity
@Table(name = "MyEntity")
@org.hibernate.annotations.Table(appliesTo = "MyEntity")
public class MyEntity
{
    @Enumerated(value = javax.persistence.EnumType.STRING)
    @Transient
    @Formula(value = "select e.state from OTHER_ENTITY e")
    private State state;

    public State getState()
    {
        return this.state;
    }
//setter and another properties
}
但它忽视了这一点

这是我的
持久化单元

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="myPersistence" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <mapping-file>META-INF/orm.xml</mapping-file>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
        <property name="hibernate.connection.url" value="jdbc:mysql://url:3306/db" />
        <property name="hibernate.connection.username" value="root" />
        <property name="hibernate.connection.password" value="root" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />
    </properties>
</persistence-unit>

org.hibernate.ejb.HibernatePersistence
META-INF/orm.xml
真的

生成sql时不使用
公式

如果我删除
@Transient
JPA
尝试加载
状态
列,然后失败

我想根据另一个实体的状态计算状态。这就是我认为
公式
有效的原因

谢谢大家!


Udo.

我认为这应该行得通。我认为@Transient让Hibernate完全忽略了这个属性

@Entity
@Table(name = "MyEntity")
@org.hibernate.annotations.Table(appliesTo = "MyEntity")
public class MyEntity
{
    // MAYBE YOU HAVE TO MOVE IT TO THE GETTER @Enumerated(value = javax.persistence.EnumType.STRING)
    // REMOVE THIS @Transient
    private State state;

    @Enumerated(value = javax.persistence.EnumType.STRING) // MOVED
    @Formula(value = "(select e.state from OtheEntity e)")
    public State getState()
    {
        return this.state;
    }
//setter and another properties
}

您尝试两次映射状态:一次是向字段添加注释,另一次是向getter添加注释。将所有注释放在同一位置(并且与
@Id
注释放在同一位置)

但这确实令人困惑。您的状态是瞬态的(意味着它根本不被映射,也不应该从数据库中读取),但它也被枚举(既然它应该是瞬态的,为什么Hibernate会使用这个注释)和一个公式


最后,公式是在用于加载实体的每个SQL中添加的SQL片段。因此,它不应该包含select子句或from子句,而应该只包含一个使用表本身的某些列的公式。例如,假设您有一个包含列
salary
和列
bonus
的表,您可以有一个字段
totalIncome
的公式,即“bonus+salary”。但我没有做更多

但是如果我不想在db中声明一列,那么@Transient is neede?否。公式已经说明:这不是db中的一列,而是根据其他列计算的值。所以不需要瞬态。那么为什么它因为缺少该列而无法加载持久性单元呢?也许我错了,但是Hibernate文档中的所有公式示例都没有使用瞬态注释。通常,Hibernate不关心数据库中缺少的列,直到它尝试加载或将某些内容持久化到表中。好吧,他们的示例中是否使用JPA,我通读了所有文档,没有找到使用JPA的完整示例。问题是,如果列不在那里,它就会一直失败。也许是JPA考试不及格+1无论如何,为了给您提供明智的建议和澄清,最好在
@Formula
中的
select
子句周围添加括号?