今天真的是我拉头的日子。
我想保留一个具有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
请注意,在日志文件中看不到“创建用户” - 因此找到了用户。
答案 0 :(得分:1)
尝试@persistence.ManyToOne(cascade = CascadeType.PERSIST)
答案 1 :(得分:1)
确保在相同的持久性上下文中找到目标对象(相同的EntityManager / transaction)。 还要确保其ID已正确映射。 请包含完整的异常堆栈跟踪以及用于保留对象的代码。