我遇到的问题是我在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;
}
输出是俱乐部仍然是足球,如下:
俱乐部:足球
俱乐部:足球
俱乐部:足球
答案 0 :(得分:2)
你正在修改约翰但是打印Lizz。 Lizz没有改变(因为Lizz的俱乐部已经加载而且没有刷新)。
原因是因为John和Lizz的获取是在2个不同的事务中,因此有2个不同的持久化上下文。
如果有一个事务跨越BOTH John和Lizz的提取,则俱乐部将是两个相同/单个实例,因为底层持久性上下文被限定为事务并确保它们为俱乐部使用相同的实例。
作为一个侧面点,你应该看看启用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();
}