如何正确持久化javax.persistence.ManyToOne

时间:2011-05-09 14:27:45

标签: scala jpa glassfish-3

今天真的是我拉头的日子。

我想保留一个具有ManyToOne关系的新对象,其中目标可能存在,也可能不存在。

我目前的方法是首先尝试使用唯一属性从数据库中读取目标。

如果这种情况失败,那么我创建并持久保存新目标。但是从日志文件中我可以看到找到了对象,并且没有调用create和persist部分。

我将目标属性从源实体设置为目标实体。最后我尝试坚持源实体。

最后我得到了«java.lang.IllegalStateException:在同步过程中,通过未标记级联的关系找到了一个新对象PERSIST»

这似乎是完整的bollocks。刚刚从数据库中读取了很多内容,为什么级联PERSIST是。

我可以提供整个来源 - 但是所有Scala都可能会让人感到困惑,然后才会有所帮助。

ManyToOne定义

     /**
      * User who's time is recorded.
      */
     @persistence.JoinColumn (nullable = false)
     @persistence.ManyToOne
     private [this] var Benutzer: Benutzer = _

     /**
      * User who's time is recorded.
      *
      * @return a copy of the Benutzer
      */
     def getBenutzer = this.Benutzer

     /**
      * Project short name (i.E. "a20999002006")
      * 
      * @param a new Benutzer
      */
     def setBenutzer (Benutzer: Benutzer) =
     {
        if (Benutzer == null )
        {
           val Exception = new IllegalArgumentException ("Benutzer must be set.")
           Zeitstempel.logger.log (logging.Level.FINE, "Throw:", Exception)
           throw Exception
        }
        else
        {   
           this.Benutzer = Benutzer
        } // if
     } // setBenutzer

我也尝试过添加级联持久注释。但这没有用,因为我得到了一个独特的约束异常。

坚持常规

     /**
      * Add a “Kommen” time to the database.
      *
      * @param uhrzeit Time to record
      */
     @javax.annotation.security.RolesAllowed (Array ("employee", "manager"))
     override def Add (entry: Zeitstempel) =
     {
        val Search_Benutzer = entry getBenutzer
        val Query_Benutzer = entityManager createNamedQuery "Find_Benutzer_By_User_ID"

        Query_Benutzer.setParameter ("ID", Search_Benutzer getUser_ID)

        ZeitstempelModel.logger.log (
           logging.Level.INFO,
           "Search user : {0}",
           Search_Benutzer)

        val Found_User = try
        {
           Query_Benutzer.getSingleResult.asInstanceOf[Benutzer]
        }
        catch
        {
           case exception: javax.persistence.NoResultException =>
              ZeitstempelModel.logger.log (
                 logging.Level.INFO,
                 "Create user : {0}",
                 Query_Benutzer)
              entityManager persist Search_Benutzer
              Search_Benutzer
        } // try

        ZeitstempelModel.logger.log (
           logging.Level.INFO,
           "Found user  : {0}",
           Found_User)

        entry setBenutzer Found_User
        entityManager persist entry
     } // Add

请注意,在日志文件中看不到“创建用户” - 因此找到了用户。

2 个答案:

答案 0 :(得分:1)

尝试@persistence.ManyToOne(cascade = CascadeType.PERSIST)

答案 1 :(得分:1)

确保在相同的持久性上下文中找到目标对象(相同的EntityManager / transaction)。 还要确保其ID已正确映射。 请包含完整的异常堆栈跟踪以及用于保留对象的代码。