2017-08-18 22 views
0

私はspring mvc環境でhibernate ormを使用してDBを扱っています。hibernate&spring、無効な識別子

私はいくつかのテーブルを持っています。

問題は、hibernateが実行されるときにsqlが生成されることです。「hbm2_ddl auto」を構成することでsqlが表示されることがありますが、問題はありません。 SQLに無効な識別子があります。

select newsreplie0_.news_article# as news6_3_4_, newsreplie0_.reply# as reply1_4_, 
newsreplie0_.reply# as reply1_4_3_, newsreplie0_.account_account# as account5_4_3_, 
newsreplie0_.content as content4_3_, newsreplie0_.dt as dt4_3_, 
newsreplie0_.news_article# as news6_4_3_, newsreplie0_.reply_at as reply4_4_3_, 
account1_.account# as account1_0_0_, account1_.email as email0_0_, 
account1_.passwd as passwd0_0_, accountpro2_.account# as account1_1_1_, 
accountpro2_.nickname as nickname1_1_, accountsec3_.account# as account1_2_2_, 
accountsec3_.activate_key as activate2_2_2_, accountsec3_.activated as activated2_2_, 
accountsec3_.enabled as enabled2_2_, accountsec3_.login_failed as login5_2_2_ 
from news_reply newsreplie0_ 
left outer join 
cookingstep.account account1_ on newsreplie0_.account_account#=account1_.account# 
left outer join 
cookingstep.account_profile accountpro2_ on account1_.account#=accountpro2_.account# 
left outer join 
cookingstep.account_security accountsec3_ on account1_.account#=accountsec3_.account# 
where newsreplie0_.news_article#=9 
{FAILED after 4 msec} 

上記の文は、hibernateによって生成されたSQLです。エラーは次のとおりです。

java.sql.SQLSyntaxErrorException: 
ORA-00904: "NEWSREPLIE0_"."ACCOUNT_ACCOUNT#": Invalid Identifier 

この例外メッセージには、「ACCOUNT_ACCOUNT#」という列があります。 "ACCOUNT_"に続くものではなく、単に "ACCOUNT#"でなければなりません。

したがって、単語を削除するにはどうすればよいですか?

EDIT:

お返事ありがとうございました。以前私も同様の質問をしました。 そしてその記事をチェックアウトしたところ、@ JoinColumnアノテーションが欠落していたようです。今それは働く。

ここは私のエンティティです。ユーザー情報ニュースコミュニティ記事の返信リストの

package com.musicovery12.cookingstep.persistence.model; 

import java.io.Serializable; 
import java.util.HashSet; 
import java.util.Set; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.OneToOne; 
import javax.persistence.SequenceGenerator; 
import javax.persistence.Table; 
import javax.persistence.UniqueConstraint; 


@Entity 
@Table(name="account", catalog="cookingstep", uniqueConstraints= { 
     @UniqueConstraint(columnNames="email") 
}) 
public class Account implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    private int accountId; 
    private String email; 
    private String password; 
    private Set<UserRole> userRoles = new HashSet<UserRole>(0); 
    private AccountProfile profile; 
    private AccountSecurity security; 
    private Set<News> newsList; 
    private Set<NewsReply> newsReplyList; 

    public Account() {} 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_account") 
    @SequenceGenerator(name="seq_account", sequenceName="seq_account", allocationSize=1) 
    @Column(name="account#", unique=true, nullable=false) 
    public int getAccountId() { 
     return accountId; 
    } 

    public void setAccountId(int accountId) { 
     this.accountId = accountId; 
    } 

    @Column(name="email", unique=true, nullable=false) 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    @Column(name="passwd", nullable=false) 
    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @OneToMany(mappedBy="pk.account", fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
    public Set<UserRole> getUserRoles() { 
     return userRoles; 
    } 

    public void setUserRoles(Set<UserRole> userRoles) { 
     this.userRoles = userRoles; 
    } 

    @OneToOne(mappedBy="account", fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
    public AccountProfile getProfile() { 
     return profile; 
    } 

    public void setProfile(AccountProfile profile) { 
     this.profile = profile; 
    } 

    @OneToOne(mappedBy="account", fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
    public AccountSecurity getSecurity() { 
     return security; 
    } 

    public void setSecurity(AccountSecurity security) { 
     this.security = security; 
    } 

    @OneToMany(mappedBy="account", fetch=FetchType.LAZY, cascade=CascadeType.ALL) 
    public Set<News> getNewsList() { 
     return newsList; 
    } 

    public void setNewsList(Set<News> newsList) { 
     this.newsList = newsList; 
    } 

    @OneToMany(mappedBy="account", fetch=FetchType.LAZY, cascade=CascadeType.ALL) 
    public Set<NewsReply> getNewsReplyList() { 
     return newsReplyList; 
    } 

    public void setNewsReplyList(Set<NewsReply> newsReplyList) { 
     this.newsReplyList = newsReplyList; 
    } 




} 

とNewsReply.javaため

Account.java。

package com.musicovery12.cookingstep.persistence.model; 

import java.util.Date; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.SequenceGenerator; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 

@Entity 
@Table(name="news_reply") 
public class NewsReply { 

    private int replyId; 
    private News news; 
    private Date date; 
    private String content; 
    private Account account; 
    private int replyAt; 


    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="gen_seq") 
    @SequenceGenerator(name="gen_seq", sequenceName="gen_seq", allocationSize=1) 
    @Column(name="reply#", unique=true, nullable=false) 
    public int getReplyId() { 
     return replyId; 
    } 
    public void setReplyId(int replyId) { 
     this.replyId = replyId; 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name="dt") 
    public Date getDate() { 
     return date; 
    } 
    public void setDate(Date date) { 
     this.date = date; 
    } 

    @Column(name="content", nullable=false) 
    public String getContent() { 
     return content; 
    } 
    public void setContent(String content) { 
     this.content = content; 
    } 

    @Column(name="reply_at") 
    public int getReplyAt() { 
     return replyAt; 
    } 
    public void setReplyAt(int replyAt) { 
     this.replyAt = replyAt; 
    } 

    @ManyToOne 
    public News getNews() { 
     return news; 
    } 
    public void setNews(News news) { 
     this.news = news; 
    } 

    @ManyToOne 
    @JoinColumn(name="account#", referencedColumnName="account#") 
    public Account getAccount() { 
     return account; 
    } 
    public void setAccount(Account account) { 
     this.account = account; 
    } 
} 

NewsReply.javaには、foreing key列名を指すJoinColumnアノテーションがありませんでした。

ありがとうございます。

+0

ORMマッピングクラスを投稿できますか? –

+1

hibernate.hbm2ddl.autoとは何ですか?検証、更新、作成、クレイトドロップ? Accountのエンティティクラスを投稿します。キャメルケースがあなたを騙しているかもしれません。 – kkflf

+0

ORMマッピングクラスの記事が更新されました。 hbm2ddl.autoプロパティがvalidとして設定されている – PLAYMAKER

答えて

0
@ManyToOne 
@JoinColumn(name="account#", referencedColumnName="account#") 
public Account getAccount() { 
    return account; 
} 

これは表が許可されていないものをaccount#の技術的な名前を持って休止伝える、問題となっています。あなたは何ができるか

@ManyToOne 
@JoinColumn(name="`account#`", referencedColumnName="`account#`") 
public Account getAccount() { 
    return account; 
} 

を定義することによって、その#を使用するために休止状態を強制することです。しかし、これは悪いスタイルで、あなたも所有側でそれをしなければなりません。


なぜあなたは休止状態にしてエンティティを作成しませんか?彼ははるかに正確です!