如何更新ebean orm中的所有引用

How to update all references in ebean orm

我在更新 ebean 中的模型时遇到问题,但未更改对该模型的其他引用。 我想知道是否可以使用连接列或@ManyToMany 映射自动更新或刷新任何引用更新模型的模型。

这是我的测试代码:

// Create students and club
Student john = new Student("John");
Student lizz = new Student("Lizz");
Club soccer = new Club("Soccer");

// Save the students
server.save(john);
server.save(lizz);

// Add them to their club
john.getClubs().add(soccer);
server.save(john);
lizz.getClubs().add(soccer);
server.save(lizz);

// Reload users (fresh)
john = server.find(Student.class).where().ieq("name", "john").findUnique();
lizz = server.find(Student.class).where().ieq("name", "lizz").findUnique();
System.out.println("Club: " + lizz.getClubs().get(0).getName());

// Modify the club name
john.getClubs().get(0).setName("Baseball");
System.out.println("Club: " + lizz.getClubs().get(0).getName());

// Update the club
server.save(john);
System.out.println("Club: " + lizz.getClubs().get(0).getName());

这些是我的模型:

@Entity
@Table(name = "students")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, updatable = false)
    private int id;

    @Column
    private String name;

    @ManyToMany(mappedBy = "students", cascade = CascadeType.ALL)
    private List<Club> clubs;

    @Version
    private long version;
}

和:

@Entity
@Table(name = "clubs")
public class Club {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, updatable = false)
    private int id;

    @Column
    private String name;

    @ManyToMany
    @JoinColumn
    private List<Student> students;

    @Version
    private long version;
}

输出是 club 仍然是 Soccer,像这样:
社团:足球
社团:足球
社团:足球

您正在修改 John 但正在打印 Lizz。 Lizz 没有改变(因为 Lizz 的俱乐部已经加载并且没有刷新)。

原因是因为 John 和 Lizz 的提取在 2 个不同的事务中,因此有 2 个不同的持久性上下文。

如果有一个事务跨越 John 和 Lizz 的获取,那么俱乐部将成为两者的 same/single 实例,因为底层持久性上下文的范围限定为事务并确保它们使用相同的实例为俱乐部。

作为一个方面,您应该查看打开 SQL 和事务日志记录,以便您确认它按照您认为应该执行的操作:

<!-- LOGBACK configuration -->

<!-- SQL and bind values -->
<logger name="org.avaje.ebean.SQL" level="TRACE"/>

<!-- Transaction Commit and Rollback events -->
<logger name="org.avaje.ebean.TXN" level="TRACE"/> 

日志配置参考http://ebean-orm.github.io/docs/setup/logging

做:

server.beginTransaction();
try {
   // persistence context scoped to transaction so 
   // .. now spans both fetches giving John and Lizz
   // .. the same shared Club instance
   john = server.find(Student.class).where().ieq("name", "john").findUnique();
  lizz = server.find(Student.class).where().ieq("name", "lizz").findUnique();
} finally {
  server.endTransaction();
}