2012-02-05 19 views
19

私のプロジェクトではUser,Role,UserRoleおよびBloodGroupエンティティがあります。まず私は、DBからList<BloodGroup>を取り、Userに設定します。それから私はUserRoleUserRole entitesを与えます。その後、私はDBにUserを挿入し、その後、私はUserRoleを挿入しようと、私はエラーを取得します。私はDBに見ると、BloodGroupのIDは、Userテーブルに挿入されていません。org.hibernate.TransientObjectException:オブジェクトは未保存の一時インスタンスを参照します - フラッシングする前に一時インスタンスを保存します

私は、リスト内の最初のBloodGroupを選択した場合、私はエラーを取得します。その他のオプションは正常です。

私はcascade = CascadeType.ALLを見つけましたが、これは同じデータをBloodGroupに追加しています。これは、さらにArh + BloodGroupがあることを意味します。

エンティティ:

@Entity 
@Table(name="USERS") 
public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long userid; 

    @OneToMany(mappedBy="user") 
    private List<Userrole> userroles; 

    //bi-directional many-to-one association to Bloodgroup 
    @ManyToOne 
    @JoinColumn(name="BLOODGRUPID") 
    private Bloodgroup bloodgroup; 

} 

@Entity 
public class Bloodgroup implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int bloodgroupid; 

    private String bloodgroupname; 

    @OneToMany(mappedBy="bloodgroup") 
    private List<User> users; 

} 

@Entity 
public class Userrole implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long userroleid; 

    private Timestamp createddate; 

    private Timestamp deleteddate; 

    private String isactive; 

    //bi-directional many-to-one association to Role 
    @ManyToOne 
    @JoinColumn(name="ROLEID") 
    private Role role; 

    //bi-directional many-to-one association to User 
    @ManyToOne 
    @JoinColumn(name="USERID") 
    private User user; 

} 

コントローラー:

user.setBloodgroup(bloodGroupImpl.getBloodGroupById(bGroup)); 
user.setUserid(userImpl.insertUserProfile(user)); 
userRoleImpl.insertUserRole(user,role); 

DAO:

public void insertUserRole(User user, Role role) { 
    Session session =getHibernateTemplate().getSessionFactory().getCurrentSession(); 
    Userrole uRole = new Userrole(); 
    uRole.setIsactive("1"); 
    uRole.setRole(role); 
    uRole.setUser(user);   
    session.save(uRole); 
    session.flush();   
} 


public void insertUserProfile(User user) { 
    Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); 
    session.save(user); 
} 

ログイン:

Hibernate: 
insert 
into 
    IU.Userrole 
    (userroleid, createddate, deleteddate, isactive, ROLEID, USERID) 
values 
    (default, ?, ?, ?, ?, ?) 

05.Şub.2012 19:23:29 com.sun.faces.application.ActionListenerImpl processAction 
SEVERE: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.iu.eblood.model.Bloodgroup 
javax.faces.el.EvaluationException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.iu.eblood.model.Bloodgroup 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:103) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:310) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
+0

あなたがエラーをスローするコードを提供してもらえますか?インスタンスの保存方法を確認するだけです。 – ivowiblo

+2

インターネット上でランダムなことを試す代わりに、エラーの意味を理解し、例外がスローされた場所を検出し、エラーを修正するようにしてください。完全なスタックトレースと、この例外を発生させるコードを表示してください。 –

答えて

39

あなたの問題を適切にカスケードdepedenciesを定義することによって、またはその参照エンティティを保存する前に、参照エンティティを保存することによって解決されます。カスケーディングを定義することは、それらがどのように使用されるかの微妙な違いのために正しくなるのは難しいです。ここで

あなたはカスケードを定義する方法である。このシナリオでは、

@Entity 
public class Userrole implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long userroleid; 

    private Timestamp createddate; 

    private Timestamp deleteddate; 

    private String isactive; 

    //bi-directional many-to-one association to Role 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="ROLEID") 
    private Role role; 

    //bi-directional many-to-one association to User 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="USERID") 
    private User user; 

} 

、あなたが保存するたびに、更新、削除などUSERROLE、assocaited役割とユーザーも更新、保存されます...

ご利用の場合は、単にさらにUSERROLE

を変更する前に、ユーザーまたはロールを保存し、USERROLEを更新するときにユーザーまたはロールを変更しないことを要求した場合再度、双方向の関係は一方向の所有権を持っています。この場合、ユーザーはBloodgroupを所有しています。したがって、カスケードはUser - > Bloodgroupからのみ実行されます。ここでも、あなたはBloodgroupと関連付けるために、(それを添付するか、非過渡作る)データベースにユーザーを保存する必要があります。

10

私は同様の問題がありましたが、参照されたエンティティが最初に保存されていることを確認しましたが、同じ例外が発生しても失敗します。 数時間の調査の結果、参照されたエンティティの「バージョン」列がNULLだったために問題が発生していました。私はHSQLDBに最初に挿入された私の特定のセットアップで (すなわち、ユニットテストであった)そのような行:

INSERT INTO project VALUES (1,1,'2013-08-28 13:05:38','2013-08-28 13:05:38','aProject','aa',NULL,'bb','dd','ee','ff','gg','ii',NULL,'LEGACY','0','CREATED',NULL,NULL,1,'0',NULL,NULL,NULL,NULL,'0','0', NULL); 

上記の問題は、休止状態で使用されるバージョンカラムはそう、nullに設定していますオブジェクトが正しく保存されたとしても、Hibernateはそのオブジェクトを保存されていないものとみなします。バージョンにNON-NULL(この場合1)の値があることを確認すると、例外が消えてすべて正常に機能しました。

これは私がこれを理解するのに長い時間を要し、ソリューションが上記と完全に異なるので、他の誰かが同じ問題を抱えている場合に備えてここに入れています。

+2

Hibernateは常に最悪のエラーメッセージを出します...私の仕事の苦労... – Serge

+1

この回答をありがとう....同じ問題が私に私の髪を引き裂いていました...私はあらゆる種類のトランザクションを試していましたカスケードオプションは、問題がNULLバージョンフィールドであったことを検出するだけです...この問題を文書化している他の場所は見つかりませんでした。 –

+1

この回答ありがとうございます。これは私にとっては春の起動時にCommandLineRunnerを使用してユーザーを作成するときにも当てはまりました(NULLを含むいくつかの値を持っていますが、そのような場合はオブジェクトが未保存と見なされることはありません) – lenach87

1

@ManyToOne属性に@Cascadeを追加してこの問題を解決しました。代わりに、参照オブジェクトを渡すの

import org.hibernate.annotations.Cascade; 
import org.hibernate.annotations.CascadeType; 

@ManyToOne 
@JoinColumn(name="BLOODGRUPID") 
@Cascade({CascadeType.MERGE, CascadeType.SAVE_UPDATE}) 
private Bloodgroup bloodgroup; 
0

は下記、保存されたオブジェクトを渡された私の問題を解決するための説明です:

//wrong 
entityManager.persist(role); 
user.setRole(role); 
entityManager.persist(user) 

//right 
Role savedEntity= entityManager.persist(role); 
user.setRole(savedEntity); 
entityManager.persist(user) 
関連する問題

 関連する問題