- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否可以在 JPA 中定义一个通用实体(如我的情况 PropertyBase)并派生具体实体类(如 ShortProperty 和 StringProperty)并将它们与 SINGLE_TABLE 继承模式一起使用?
如果我尝试通过 EntityManager 提交新创建的 ElementModel 实例(请参阅 ElementModelTest),我总是会收到 NumberFormatException,表示“值”无法正确转换为 Short。奇怪的是,如果我将下面的所有类定义为我的测试用例类“ElementModelTest”的内部静态类,这似乎有效。
我需要改变什么才能使这项工作成功?
我正在使用 EclipseLink eclipselink-2.6.0.v20131019-ef98e5d。
public abstract class PersistableObject implements Serializable {
private String id = UUID.randomUUID().toString();
private Long version;
}
public abstract class PropertyBase<T> extends PersistableObject {
private String name;
private T value;
}
public class ShortProperty extends PropertyBase<Short> {
...
}
public class StringProperty extends PropertyBase<String> {
...
}
public class ElementModel extends PersistableObject {
private StringProperty name = new StringProperty();
private ShortProperty number = new ShortProperty();
}
public class ElementModelTest extends ModelTest<ElementModel> {
@Test
@SuppressWarnings("unchecked")
public void testSQLPersistence() {
final String PERSISTENCE_UNIT_NAME = getClass().getPackage().getName();
new File("res/db/test/" + PERSISTENCE_UNIT_NAME + ".sqlite").delete();
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
for (int i = 0; i < 10; ++i) {
ElementModel device = new ElementModel();
device.setName("ElementModel: " + i);
device.setNumber((short) i);
em.persist(device);
}
em.getTransaction().commit();
em.close();
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">
<mapped-superclass
class="PersistableObject">
<attributes>
<id name="id">
<column name="id" />
</id>
<version name="version" access="PROPERTY">
<column name="version" />
</version>
</attributes>
</mapped-superclass>
<entity class="PropertyBase">
<table name="PropertyBase" />
<inheritance />
<discriminator-column name="type"/>
<attributes>
<basic name="name">
<column name="name" />
</basic>
<basic name="value">
<column name="value" />
</basic>
</attributes>
</entity>
<entity class="StringProperty">
<discriminator-value>StringProperty</discriminator-value>
</entity>
<entity class="ShortProperty">
<discriminator-value>ShortProperty</discriminator-value>
</entity>
<entity class="ElementModel">
<table name="ElementModel" />
<inheritance />
<discriminator-column name="type"/>
<attributes>
<one-to-one name="name">
<join-column name="name" referenced-column-name="id" />
<cascade>
<cascade-all />
</cascade>
</one-to-one>
<one-to-one name="number">
<join-column name="number" referenced-column-name="id" />
<cascade>
<cascade-all />
</cascade>
</one-to-one>
</attributes>
</entity>
</entity-mappings>
最佳答案
你的问题是PropertyBase<T>
是一个具有字段 value
的实体是持久的。您的数据库需要将该字段类型映射到列类型,并且您拥有三个实体,它们的同一字段具有不同的 java 类型:PropertyBase<T>
是通用的,它本身不知道它的类型 value
字段是,StringProperty
说它是一个字符串并且 ShortProperty
说这是一个短片。所以这是一个冲突。
为了克服这个问题,你创建字段 value
transient ,以及 PropertyBase<T>
的每个子类型(如 StringProperty
)您可以使用不同的名称定义一个新的可持久属性,例如 StringProperty
将有一个private String stringValue
, ShortProperty
将有一个private Short shortValue
,每个字段都会映射到不同的数据库列。
PS:我无法解释为什么当你创建所有类时它会起作用 static inner
.
关于java - EclipseLink + JPA + 通用实体 + SINGLE_TABLE 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19537255/
晚上好。我正在尝试使用 JPA/Hibernate 将类层次结构映射到单个表,并在我的子类上收到一条错误消息,指出“实体没有定义主键属性”。类定义如下: @Entity @Table(name = "
我将一些 hbm 配置翻译为带注释的 java 类。在 hbm 中,一些类是使用继承策略“SINGLE_TABLE”定义的,并且其他一些实体以多对一关系将其引用为 Map。 当我尝试启动应用程序时,出
在使用 SINGLE_TABLE 继承策略时是否可以使用枚举作为判别器值? 最佳答案 如果您想要实现的是不重复鉴别器值,则有一个简单的解决方法。 @Entity @Inheritance(strate
AppEngine 仅支持 JPA 继承的“TABLE_PER_CLASS”和“MAPPED_SUPERCLASS”。不幸的是,不支持“JOINED”,尤其是“SINGLE_TABLE”。 我想知道实
我有 3 个类: @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) public abstract class Tag {
例如我们有这样的结构: @Entity @Table(name = "A") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Discri
我的类结构如下所示...我在这里实现了两种单独的策略,但根类的继承策略(即 InheritanceType.JOINED)正在整个层次结构中使用... @Entity @Inheritance(str
我有一个包含三个子表 Sub1、Sub2 和 Sub3 的 HeaderTable。 Sub1和Sub2需要引用HeaderTable中的同一行数据,而Sub3需要引用另一行数据。 我所做的是创建一个
我想知道是否可以在 JPA 中定义一个通用实体(如我的情况 PropertyBase)并派生具体实体类(如 ShortProperty 和 StringProperty)并将它们与 SINGLE_TA
使用这些类,您将如何将“Person”的记录更改为“Employee”。 /** * @Entity * @InheritanceType("SINGLE_TABLE") * @Discrimi
我有 3 个类扩展了一个抽象基类,它们都具有相同的形式结构。它们都是使用 Hibernate/Spring 数据工具构建并正常工作的,并且已经在生产系统中运行了几个月。然而,Hibernate 不支持
这是我想要的配置: 一个实体“Account”与另外两个实体“Author”和“AccountBackend”的 JOINED 继承。 然后我希望“AccountBackend”与其他两个实体“Adm
我在尝试使用装饰有简单限制的 hibernate 条件从数据库中列出对象时出现此错误 Criteria criteria = session.createCriteria(Licence.class)
好吧,这可能是一个远景,但现在就开始吧。 在 Java (JRE 1.6.0_26-b03) 中,我有两个类,SuperControl 及其子类 SubControl。它们都需要是持久对象,我正在使用
我将 Hibernate 3.2.2 GA 与 HSQLDB 2.0 GA 一起使用,并且我有一个类似于以下的类层次结构: @Entity @Table(name = "A_TABLE") @Inhe
我已经使用 SINGLE_TABLE with SecondaryTables 实现了继承层次结构. 这可以正常工作,但是当我的辅助表的字段为空(= Oracle 中的 null)时,对实体的下一次更
我有一个经典的 Hibernate @Inheritance(strategy=InheritanceType.SINGLE_TABLE) 和 @DiscriminatorFormula。它工作正常。
我是一名优秀的程序员,十分优秀!