JPA Annotation问题@Transient

时间:2011-08-11 12:12:42

标签: hibernate jpa

我正在尝试使用Hibernate和JPA将数据库从“Drupal”映射到一个Java层来处理数据。

在一个类中,我需要添加一个名为“rank”的属性以便以后使用它,但该属性在数据库中不存在,所以我把@Transient注释...

我使用set方法在其上放置一个值,但后来,这些值是错误的(我不明白为什么)所以...有一种方法可以在不修改数据库的情况下实现它吗?

非常感谢

编辑:

班级撰稿人

@Entity
@Table( name = "biblio_contributor_data")
public class Contributors implements Comparable {
@Id
private int cid;

private String name;

private String firstname;

private String lastname;

private Member memberProfile;

@Trasient
private int rank;

然后,我有一些文章,其中有贡献者列表作为属性。

我有一份文章清单。现在我必须更新他们的排名,并按排名对贡献者列表进行排序:

public static List<Article> sortByRankArticles(EntityManager em, List<Article> list){
for (Article article:list){
        for(Contributors c:article.getAuthors()){


            List<BiblioContributor> result  = em.createQuery("from BiblioContributor where nid = "+article.getId() +" and id.cid = "+c.getCid()).getResultList();

            c.setRank(result.get(0).getId().getRank());
            System.out.println(c.getRank());

        }

        Collections.sort(list);
    }

使用那个system.out ...我检查了值是否正确,“0,1,2,3,4,5”

但是当我完成第一个“for”时,我用相同的方法进行了测试,以证明值是否正常,但我得到以下值:0,0,1,2,2,3这是错

for (Article article:list){
        System.out.println("///////"+article.getId());
        for(Contributors c:article.getAuthors()){
            System.out.println("***"+c.getRank());

        }
    }

1 个答案:

答案 0 :(得分:0)

您应该使用Formulas直接从数据库中计算它。

您放置要用于在数据库中计算的查询。

实现这一目标的另一种方法是使用Formulas放置sql

对于此表中存在的position列:

@Formula("position + 1")
public int getRank() {
    return this.rank;
}

另一种方法是PostLoad计算

@PostLoad
public void onPostLoad() {
    int rank;
    // Calculate Rank
    this.rank = rank;
}

请注意,我不知道您的代码。所以我不能更具描述性。

问候。