我有一个包含多对一关系的JPA持久化对象模型:Account有许多Transactions.Transaction等于Account.

下面是一段代码:

@Entity
public class Transaction {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(cascade = {CascadeType.ALL},fetch= FetchType.EAGER)
    private Account fromAccount;
....

@Entity
public class Account {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @OneToMany(cascade = {CascadeType.ALL},fetch= FetchType.EAGER, mappedBy = "fromAccount")
    private Set<Transaction> transactions;

我能够创建一个Account对象,向其中添加事务,并正确保存Account对象.但是,当我创建一个事务using an existing already persisted Account并持久化the Transaction时,我得到一个例外:

原因:org.冬眠PersistentObjectException:传递给persist:com的分离实体.保尔桑瓦尔德.账户

因此,我可以持久化包含事务的Account,但不能持久化包含Account的事务.我以为这是因为可能没有附加Account,但是这段代码仍然给了我相同的例外:

if (account.getId()!=null) {
    account = entityManager.merge(account);
}
Transaction transaction = new Transaction(account,"other stuff");
 // the below fails with a "detached entity" message. why?
entityManager.persist(transaction);

如何正确保存与已持久化的Account对象关联的Transaction

推荐答案

这是一个典型的双向一致性问题.它在this linkthis link.中都有很好的讨论

根据前两个链接中的文章,你需要在双向关系的两侧修复设置器.单面的一个例子是this link.

多个方面的一个例子是在this link.

更正setter之后,您希望将实体访问类型声明为"property".声明"property"访问类型的最佳实践是将所有注释从成员属性移动到相应的getter.需要注意的是,不要在实体类中混合使用"Field"和"Property"访问类型,否则JSR-317规范将不会定义该行为.

Java相关问答推荐

Java应用程序RAC感知

如何在Java中对自定义协议进行主机名验证?

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

@ EnableRouting注释在Kotlin项目中不工作

RxJava PublishSubject缓冲区元素超时

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

工件部署期间出错[Tomcat 8.5.45]

给定Java枚举类,通过值查找枚举

Spark上下文在向Spark提交数据集时具有内容,但Spark在实际构建它时发现它为空

MimeMessage emlMessage=new MimeMessage(Session,emlInputStream);抛出InvocationTargetException

如何从日志(log)行中删除包名称?

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

如何在运行docker的应用程序中获取指定的配置文件

将BlockingQueue+守护程序线程替换为执行器

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

保持标题窗格的箭头可见,即使设置为不可折叠

如何以事务方式向ibmmq发送消息

如何使用stream.allMatch()为空流返回false?

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

这是JavaFX SceneBuilder的错误吗?