編輯後myMap.size():我發現這個beeing蝕環節的錯誤:https://bugs.eclipse.org/bugs/show_bug.cgi?id=433075的Java 8拉姆達myMap.stream()數()=合併MYMAP
原題:
在一個JUnit測試我發現了意想不到的行爲。正如你所看到的,最後一個斷言失敗了,因爲流看起來不包含任何數據,而地圖不是空的?我發現,它與jpa/eclipselink有關。
public class MyTest {
private EntityManager em;
@Before
public void setUp() throws IOException {
String dbFileName = "testDb.db";
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(PersistenceUnitProperties.JDBC_URL, "jdbc:sqlite:"
+ dbFileName);
EntityManagerFactory factory = Persistence.createEntityManagerFactory("pul", properties);
this.em = factory.createEntityManager();
}
@Test
public void testStrange() {
LV lv = new LV();
// em.persist(lv); // this would work
// em.merge(lv); // this would work as well
lv = em.merge(lv); // this leads to the assertionError
lv.getAms().add(new AM());
assertEquals(1, lv.getAms().size()); // ok
assertEquals(1, lv.getAms().stream().count()); // java.lang.AssertionError: expected:<1> but was:<0>
}
}
LV:
@Entity
public class LV {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long _id;
@OneToMany(mappedBy = "lv", cascade = CascadeType.ALL)
private Collection<AM> ams = new HashSet<AM>();
public LV() {
}
public Collection<AM> getAms() {
return ams;
}
}
AM:
@Entity
public class AM {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long _id;
@ManyToOne
private LV lv;
public AM() {
}
}
的persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="pul" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.sqlite.JDBC" />
<!-- url is set during runtime -->
<!-- <property name="javax.persistence.jdbc.url" value="jdbc:sqlite:sample.db"
/> -->
<property name="javax.persistence.jdbc.user" value="" />
<property name="javax.persistence.jdbc.password" value="" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
</properties>
</persistence-unit>
</persistence>
pom.xml的依賴關係
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.8.6</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.0-M3</version>
</dependency>
知道的'lv.getAbstractModules類型()'和'getKurzbezeichnung()'可能的幫助。 – Eran 2014-11-24 14:59:24
當我使用這些方法名稱設置虛擬類時,您的確切代碼適用於我(在列表中顯示一致的項目數)。所以我只能建議你的'lv.getAbstractModules()'方法不會隨着時間的推移返回相同的列表。 – Boann 2014-11-24 15:00:31
你有沒有機會使用自定義'List'實現,可能有一個'stream()'方法壞了? – Boann 2014-11-24 15:05:37