Спящий с JPA игнорируя @Formula - PullRequest
3 голосов
/ 19 октября 2011

У меня Formula определено как:

@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 Unit:

<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>

sql создаются без Formula.

Если я удаляю @Transient, JPA пытается загрузить столбец state и затем завершается неудачей.

Я хочу рассчитать состояние на основе состояния другого лица.Вот почему я думаю, что Formula работает.

Спасибо!

Удо.

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Вы пытаетесь отобразить состояние дважды: один раз, добавив аннотации к полю, и один раз, добавив аннотации к получателю. Поместите все аннотации в то же место (и в то же место, что и аннотация @Id).

Но это действительно сбивает с толку. Ваше состояние является переходным (то есть оно вообще не отображается и не должно считываться из базы данных), но оно также перечисляется (зачем Hibernate использовать эту аннотацию, поскольку она должна быть переходной) и формулу.

Наконец, формула - это некоторый фрагмент SQL, который добавляется в каждый SQL, используемый для загрузки вашей сущности. Таким образом, он не должен содержать предложение select или предложение from, а только формулу, использующую некоторые столбцы самой таблицы. Например, предположим, что у вас есть таблица со столбцом salary и столбцом bonus, у вас может быть формула для поля totalIncome, которая будет «бонус + зарплата». Но id не идет намного дальше, чем это.

2 голосов
/ 19 октября 2011

Я думаю, что это должно работать. Я думаю, что @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
}
...